mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-02-04 14:33:28 +08:00
general tidying
This commit is contained in:
parent
02c44dade0
commit
cd7288c66b
@ -420,7 +420,7 @@
|
|||||||
"assets/build/ba_data/audio/zoeOw.ogg": "https://files.ballistica.net/cache/ba1/51/eb/0a567253cc08c94c5d315a64d9af",
|
"assets/build/ba_data/audio/zoeOw.ogg": "https://files.ballistica.net/cache/ba1/51/eb/0a567253cc08c94c5d315a64d9af",
|
||||||
"assets/build/ba_data/audio/zoePickup01.ogg": "https://files.ballistica.net/cache/ba1/bc/8f/a9c51a09c418136e386b7fdf21c7",
|
"assets/build/ba_data/audio/zoePickup01.ogg": "https://files.ballistica.net/cache/ba1/bc/8f/a9c51a09c418136e386b7fdf21c7",
|
||||||
"assets/build/ba_data/audio/zoeScream01.ogg": "https://files.ballistica.net/cache/ba1/02/e5/84916e123f47ccf11ddda380d699",
|
"assets/build/ba_data/audio/zoeScream01.ogg": "https://files.ballistica.net/cache/ba1/02/e5/84916e123f47ccf11ddda380d699",
|
||||||
"assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/a7/67/0179e7eae3d1c7a4a9df6049229d",
|
"assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/9c/1a/009abe989d70291b56753f83de7b",
|
||||||
"assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/ca/75/3de74bd6e498113b99bbf9eda645",
|
"assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/ca/75/3de74bd6e498113b99bbf9eda645",
|
||||||
"assets/build/ba_data/data/languages/belarussian.json": "https://files.ballistica.net/cache/ba1/55/8c/8d0a0585e434b94865ae4befc090",
|
"assets/build/ba_data/data/languages/belarussian.json": "https://files.ballistica.net/cache/ba1/55/8c/8d0a0585e434b94865ae4befc090",
|
||||||
"assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/f6/21/951b7ff02b0ad14b1f0ac55763c4",
|
"assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/f6/21/951b7ff02b0ad14b1f0ac55763c4",
|
||||||
@ -3971,50 +3971,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/__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",
|
"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",
|
"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/c6/ec/4a5ae56bc104b67f5947e1116941",
|
"build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a4/23/4b754faff34d9d48a71da46c37f6",
|
||||||
"build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/74/1d/fc9e33e565475daaac80da5252f0",
|
"build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/74/1d/fc9e33e565475daaac80da5252f0",
|
||||||
"build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/7f/33/05fdff46eaeef33a14fefe3fda47",
|
"build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9b/24/84f417c05955d774c31025600cc2",
|
||||||
"build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/94/d9/694b66a227996a6f4f3d327fc04f",
|
"build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/69/2e/78b04116b9a5e0eeabb441a9707c",
|
||||||
"build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/c0/03/71007fb271765f59e1f6da338ee3",
|
"build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8b/bb/486b68926dc17aec434a79166d4b",
|
||||||
"build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/9c/7b/ac1a200be0f37078af0991faca3b",
|
"build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/9c/7b/ac1a200be0f37078af0991faca3b",
|
||||||
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3a/e7/d46a2e18de4065fcb7ad93c390ee",
|
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/39/5f/d58c5760ae57284d3d8f981d70dd",
|
||||||
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2e/fe/50afc5694cfc4a9a61b5f7dbf34f",
|
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c4/42/11ee47b79299021ba19695793636",
|
||||||
"build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ed/d9/cac56715e2a962a1bc31c4aab8e2",
|
"build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/c9/e0/190024d4371954e5af7c588aa17d",
|
||||||
"build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/12/4c/1ec2cc28e433127a738b09292bc2",
|
"build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/22/20/94bd911fe574b6ce831aa0f62478",
|
||||||
"build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/84/4e/11bf104575097a3ffaeff32cd117",
|
"build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/f8/f4/ac3127a98b11bf7ce5e7acdcf552",
|
||||||
"build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d2/cd/0a663ac709ffc1d586db166846ca",
|
"build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/cf/b2/e70ec7a47ed9bbbda951c01e06df",
|
||||||
"build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/70/3d/ab729c4d64a89bcdf9e027762151",
|
"build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f7/0a/adc60ccd753241e03039e98aa734",
|
||||||
"build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ce/db/c14c70155a8b0dac5b9d18b63e2d",
|
"build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/47/74/93b23d43435b16bad3bde1ca0e88",
|
||||||
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/2e/9c/caab75ae18baeab56e5eae396936",
|
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/09/36/64e7c1425316335f0fa2cb7b692a",
|
||||||
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/42/25/87063e7bf8559de0cb5572de6508",
|
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/cc/36/27b1c5c714850a3ea2cfa83ee35e",
|
||||||
"build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/15/58/52f7fbaa5210d2ab5afd01eb3bc7",
|
"build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/84/0a/6712d37d94dcf811e828a63b488f",
|
||||||
"build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/0e/7d/30dc7459479700a2e50d44201471",
|
"build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/59/01/04af869d8334397bf7368791e9f6",
|
||||||
"build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/d1/ed/0988a7e61de0e09875e0f18a76cc",
|
"build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/12/ae/725259070ca6fbc65075d3aa6198",
|
||||||
"build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/f3/5e/1a53dc3eef98694fed7a341058c7",
|
"build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/c9/70/b2dd8c22a7a2c1ecf264797e68a4",
|
||||||
"build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/db/b3/f606248668c48ec4c3088ba5b8b5",
|
"build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/21/91/eb4b0119f4980c19c8fdc636e493",
|
||||||
"build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/77/20/f9e6b32d95d24e87ae5b73b016cf",
|
"build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6f/4b/34dcc5f14c2547f4c16cda7b05c1",
|
||||||
"build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/18/d2/bfc47ac110285a0c2f48babcff03",
|
"build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/5a/38/91689a90fad69186191b3d55dd70",
|
||||||
"build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1b/25/46721d6d1a6286df32b5c999a7d1",
|
"build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fe/aa/c85f26afd6babc5f1ef9636dcfbd",
|
||||||
"build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b8/e4/ddbf15a2ec9fa0a3edff2d0e897a",
|
"build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/94/0a/5fdf30ef59684a9036138f4c97d5",
|
||||||
"build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/69/a3/b56d339f4dc95b5333c97e423d8c",
|
"build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ea/fc/263f0339e7e8815648d93ad41143",
|
||||||
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/bf/53/63ceb27c4f2eea9fc4e8455f8f30",
|
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9e/d2/58b0ab135403ffa2bf3e04693ecd",
|
||||||
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a0/fc/0e6981872542df974cc69e10949d",
|
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/15/98/518a364e457218a9a55c7d726da3",
|
||||||
"build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e6/19/7a72afb6912b37b395330cba9eab",
|
"build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2d/26/8011786095c9cc80f98c16251d35",
|
||||||
"build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/db/75/d3de1742c3404572b4e85820b7d2",
|
"build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4b/0e/219f6246e32037888ce8011ab13f",
|
||||||
"build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d0/5d/8449c26ddb6a8558eba2c5d7ce6d",
|
"build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ae/cd/3370a511d9ff8a2aa4c5536f6a5a",
|
||||||
"build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/86/98/4d4a0d9a52e34e07061e31d038fd",
|
"build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/87/84/38cfc99bf6730abd39a247aa340e",
|
||||||
"build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9a/37/e528806cecf86c20acac74127499",
|
"build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/67/15/f85722b517a5782e39b4f897e64e",
|
||||||
"build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/29/16/1d9549c835276428a038f1692e22",
|
"build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2f/bb/31cc38cfadaa0f66772141b7e6ff",
|
||||||
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/86/b7/e47605a45acbad6f6f5a44b3266e",
|
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b6/41/acfa81cf0a54a440609a63b757ab",
|
||||||
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/09/56/af875f3eaacd2056b8768c6fa53c",
|
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d4/b5/483420d970e61d5f134345a3e324",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/67/a2/829f2962de6305612c07124a9297",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/59/88/0452faa29ea4e111db7f53dba04f",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/3d/d5/2bc1f16d9ef459ada00afc343a81",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/74/c7/f0f15959049ecbff24ca66005679",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/d8/84/7c17af707c4700ab75026311d21a",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/ec/49/857d97c572354d3c67cab99c0232",
|
||||||
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/fe/06/6921fe2c065426a82f912732b1ad",
|
"build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/cd/12/eea8d89b8ca7c8b554900b8d52df",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/6d/ef/4192a89cace9e99ce87d2d118e01",
|
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/83/ac/8aa2427383a58c5f6a67dd5e72a7",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/b2/a4/d9de56f34bc35d044d673986e678",
|
"build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/5f/70/a90795d12ebba994f2efca12edb6",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/6b/07/26c48232c8aeaf9ca6bdd0d54e60",
|
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/d8/06/c2007d03895420df60b8cfe574ea",
|
||||||
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/49/3a/3fddd087687893bb595ea2155e91",
|
"build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/9b/69/8c17f25bede5930ed3b6c3b3e0ae",
|
||||||
"src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/b3/15/7c6d580b3482870b5b058858624c",
|
"src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/b3/15/7c6d580b3482870b5b058858624c",
|
||||||
"src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/9d/7e/0a5125aa421e722c59d22b8beb19"
|
"src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/d3/db/e73d4dcf1280d5f677c3cf8b47c3"
|
||||||
}
|
}
|
||||||
1
.idea/ballisticacore.iml
generated
1
.idea/ballisticacore.iml
generated
@ -5,6 +5,7 @@
|
|||||||
<sourceFolder url="file://$MODULE_DIR$/assets/src/ba_data/python" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/assets/src/ba_data/python" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/tools" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/tools" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/generated_src/ballistica" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src/generated_src/ballistica" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/meta" isTestSource="false" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.efrocache" />
|
<excludeFolder url="file://$MODULE_DIR$/.efrocache" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/assets/build" />
|
<excludeFolder url="file://$MODULE_DIR$/assets/build" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/assets/src/ba_data/audio" />
|
<excludeFolder url="file://$MODULE_DIR$/assets/src/ba_data/audio" />
|
||||||
|
|||||||
11
.idea/dictionaries/ericf.xml
generated
11
.idea/dictionaries/ericf.xml
generated
@ -188,6 +188,7 @@
|
|||||||
<w>barebones</w>
|
<w>barebones</w>
|
||||||
<w>baseaddr</w>
|
<w>baseaddr</w>
|
||||||
<w>baseh</w>
|
<w>baseh</w>
|
||||||
|
<w>baseimps</w>
|
||||||
<w>basemult</w>
|
<w>basemult</w>
|
||||||
<w>basepos</w>
|
<w>basepos</w>
|
||||||
<w>baservnode</w>
|
<w>baservnode</w>
|
||||||
@ -576,6 +577,7 @@
|
|||||||
<w>dincrease</w>
|
<w>dincrease</w>
|
||||||
<w>dingsound</w>
|
<w>dingsound</w>
|
||||||
<w>dingsoundhigh</w>
|
<w>dingsoundhigh</w>
|
||||||
|
<w>dirfilter</w>
|
||||||
<w>dirmanifest</w>
|
<w>dirmanifest</w>
|
||||||
<w>dirname</w>
|
<w>dirname</w>
|
||||||
<w>dirnames</w>
|
<w>dirnames</w>
|
||||||
@ -679,6 +681,7 @@
|
|||||||
<w>efrosync</w>
|
<w>efrosync</w>
|
||||||
<w>efrotool</w>
|
<w>efrotool</w>
|
||||||
<w>efrotools</w>
|
<w>efrotools</w>
|
||||||
|
<w>efrotoolsinternal</w>
|
||||||
<w>eftools</w>
|
<w>eftools</w>
|
||||||
<w>efxjtp</w>
|
<w>efxjtp</w>
|
||||||
<w>eids</w>
|
<w>eids</w>
|
||||||
@ -692,10 +695,12 @@
|
|||||||
<w>enablexinput</w>
|
<w>enablexinput</w>
|
||||||
<w>ename</w>
|
<w>ename</w>
|
||||||
<w>encerr</w>
|
<w>encerr</w>
|
||||||
|
<w>endblock</w>
|
||||||
<w>endcall</w>
|
<w>endcall</w>
|
||||||
<w>endcommand</w>
|
<w>endcommand</w>
|
||||||
<w>endef</w>
|
<w>endef</w>
|
||||||
<w>endindex</w>
|
<w>endindex</w>
|
||||||
|
<w>endmacro</w>
|
||||||
<w>endmessage</w>
|
<w>endmessage</w>
|
||||||
<w>endparen</w>
|
<w>endparen</w>
|
||||||
<w>endtime</w>
|
<w>endtime</w>
|
||||||
@ -805,6 +810,7 @@
|
|||||||
<w>filebytes</w>
|
<w>filebytes</w>
|
||||||
<w>filecmp</w>
|
<w>filecmp</w>
|
||||||
<w>fileext</w>
|
<w>fileext</w>
|
||||||
|
<w>filefilter</w>
|
||||||
<w>filehash</w>
|
<w>filehash</w>
|
||||||
<w>fileinfo</w>
|
<w>fileinfo</w>
|
||||||
<w>fileinput</w>
|
<w>fileinput</w>
|
||||||
@ -816,6 +822,7 @@
|
|||||||
<w>filesize</w>
|
<w>filesize</w>
|
||||||
<w>filestates</w>
|
<w>filestates</w>
|
||||||
<w>filt</w>
|
<w>filt</w>
|
||||||
|
<w>filterdoc</w>
|
||||||
<w>filterlines</w>
|
<w>filterlines</w>
|
||||||
<w>filterpath</w>
|
<w>filterpath</w>
|
||||||
<w>filterpaths</w>
|
<w>filterpaths</w>
|
||||||
@ -1716,6 +1723,7 @@
|
|||||||
<w>pcommands</w>
|
<w>pcommands</w>
|
||||||
<w>pcstr</w>
|
<w>pcstr</w>
|
||||||
<w>pdataclass</w>
|
<w>pdataclass</w>
|
||||||
|
<w>pdoc</w>
|
||||||
<w>pedit</w>
|
<w>pedit</w>
|
||||||
<w>peditui</w>
|
<w>peditui</w>
|
||||||
<w>peername</w>
|
<w>peername</w>
|
||||||
@ -1973,6 +1981,7 @@
|
|||||||
<w>realsies</w>
|
<w>realsies</w>
|
||||||
<w>recache</w>
|
<w>recache</w>
|
||||||
<w>recursed</w>
|
<w>recursed</w>
|
||||||
|
<w>recursing</w>
|
||||||
<w>recv</w>
|
<w>recv</w>
|
||||||
<w>redist</w>
|
<w>redist</w>
|
||||||
<w>redistributables</w>
|
<w>redistributables</w>
|
||||||
@ -2032,6 +2041,7 @@
|
|||||||
<w>rspdata</w>
|
<w>rspdata</w>
|
||||||
<w>rsplen</w>
|
<w>rsplen</w>
|
||||||
<w>rspobj</w>
|
<w>rspobj</w>
|
||||||
|
<w>rsptypes</w>
|
||||||
<w>rstr</w>
|
<w>rstr</w>
|
||||||
<w>rtest</w>
|
<w>rtest</w>
|
||||||
<w>rtnetlink</w>
|
<w>rtnetlink</w>
|
||||||
@ -2234,6 +2244,7 @@
|
|||||||
<w>srcnode</w>
|
<w>srcnode</w>
|
||||||
<w>srcpath</w>
|
<w>srcpath</w>
|
||||||
<w>srcpathfull</w>
|
<w>srcpathfull</w>
|
||||||
|
<w>srcpaths</w>
|
||||||
<w>srcplayer</w>
|
<w>srcplayer</w>
|
||||||
<w>srcpy</w>
|
<w>srcpy</w>
|
||||||
<w>srcpydata</w>
|
<w>srcpydata</w>
|
||||||
|
|||||||
6
.idea/inspectionProfiles/Default.xml
generated
6
.idea/inspectionProfiles/Default.xml
generated
@ -70,7 +70,7 @@
|
|||||||
<inspection_tool class="PyTypeHintsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
<inspection_tool class="PyTypeHintsInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||||
<inspection_tool class="PyUnreachableCodeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
<inspection_tool class="PyUnreachableCodeInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
<scope name="PyIgnoreUnresolved" level="WARNING" enabled="true">
|
<scope name="PyIgnoreUnresolved" level="WARNING" enabled="false">
|
||||||
<option name="ignoredIdentifiers">
|
<option name="ignoredIdentifiers">
|
||||||
<list>
|
<list>
|
||||||
<option value="astroid.node_classes.NodeNG.*" />
|
<option value="astroid.node_classes.NodeNG.*" />
|
||||||
@ -84,7 +84,7 @@
|
|||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</scope>
|
</scope>
|
||||||
<scope name="UncheckedPython" level="WARNING" enabled="true">
|
<scope name="UncheckedPython" level="WARNING" enabled="false">
|
||||||
<option name="ignoredIdentifiers">
|
<option name="ignoredIdentifiers">
|
||||||
<list>
|
<list>
|
||||||
<option value="astroid.node_classes.NodeNG.*" />
|
<option value="astroid.node_classes.NodeNG.*" />
|
||||||
@ -108,12 +108,14 @@
|
|||||||
<option value="AppKit" />
|
<option value="AppKit" />
|
||||||
<option value="typing.Sequence.register" />
|
<option value="typing.Sequence.register" />
|
||||||
<option value="xml.dom.*" />
|
<option value="xml.dom.*" />
|
||||||
|
<option value="type.__getitem__" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
<inspection_tool class="PyUnusedLocalInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false">
|
<inspection_tool class="PyUnusedLocalInspection" enabled="false" level="WEAK WARNING" enabled_by_default="false">
|
||||||
<scope name="UncheckedPython" level="WEAK WARNING" enabled="false" />
|
<scope name="UncheckedPython" level="WEAK WARNING" enabled="false" />
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
|
<inspection_tool class="Pylint" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||||
<inspection_tool class="RedundantSuppression" enabled="true" level="WARNING" enabled_by_default="true">
|
<inspection_tool class="RedundantSuppression" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
<scope name="PyIgnoreProtectedAccess" level="WARNING" enabled="false" />
|
<scope name="PyIgnoreProtectedAccess" level="WARNING" enabled="false" />
|
||||||
</inspection_tool>
|
</inspection_tool>
|
||||||
|
|||||||
2
.idea/scopes/PyIgnoreUnresolved.xml
generated
2
.idea/scopes/PyIgnoreUnresolved.xml
generated
@ -1,3 +1,3 @@
|
|||||||
<component name="DependencyValidationManager">
|
<component name="DependencyValidationManager">
|
||||||
<scope name="PyIgnoreUnresolved" pattern="file:assets/src/ba_data/python/ba/internal.py||file:assets/src/ba_data/python/ba/deprecated.py||file:assets/src/ba_data/python/ba/__init__.py||file:assets/src/ba_data/python/ba/_messages.py" />
|
<scope name="PyIgnoreUnresolved" pattern="file:tools/pcommand||file:src/meta/bametainternal/python_embedded/internal_api.py||file:tools/bacloud||file:assets/src/ba_data/python/bastd/maps.py" />
|
||||||
</component>
|
</component>
|
||||||
@ -1,4 +1,7 @@
|
|||||||
### 1.6.10 (20510, 2022-03-18)
|
### 1.6.11 (20514, 2022-03-21)
|
||||||
|
- Documentation is now generated using pdoc <https://pdoc.dev>. Thanks Dliwk!!
|
||||||
|
|
||||||
|
### 1.6.10 (20511, 2022-03-20)
|
||||||
- Added `_ba.get_client_public_device_uuid` function which returns a semi-permanent device id for a connected client running 1.6.10 or newer. Can be useful to combat spam attacks or other mischief.
|
- Added `_ba.get_client_public_device_uuid` function which returns a semi-permanent device id for a connected client running 1.6.10 or newer. Can be useful to combat spam attacks or other mischief.
|
||||||
- Fixed an issue with `make update` not properly rewriting Visual Studio project files to account for new/deleted source files.
|
- Fixed an issue with `make update` not properly rewriting Visual Studio project files to account for new/deleted source files.
|
||||||
- Removed various bits of code associated with the (no-longer-functional) Google Play Games multiplayer connections.
|
- Removed various bits of code associated with the (no-longer-functional) Google Play Games multiplayer connections.
|
||||||
|
|||||||
2
Makefile
2
Makefile
@ -1025,8 +1025,6 @@ _windows-wsl-rebuild:
|
|||||||
|
|
||||||
# Generate docs.
|
# Generate docs.
|
||||||
docs:
|
docs:
|
||||||
@tools/pcommand echo BLU GENERATING DOCS HTML...
|
|
||||||
@mkdir -p ${BUILD_DIR}
|
|
||||||
@tools/pcommand gendocs
|
@tools/pcommand gendocs
|
||||||
|
|
||||||
# Tell make which of these targets don't represent files.
|
# Tell make which of these targets don't represent files.
|
||||||
|
|||||||
@ -6,7 +6,6 @@ This top level module is a collection of most commonly used functionality.
|
|||||||
For many modding purposes, the bits exposed here are all you'll need.
|
For many modding purposes, the bits exposed here are all you'll need.
|
||||||
In some specific cases you may need to pull in individual submodules instead.
|
In some specific cases you may need to pull in individual submodules instead.
|
||||||
"""
|
"""
|
||||||
# pylint: disable=unused-import
|
|
||||||
# pylint: disable=redefined-builtin
|
# pylint: disable=redefined-builtin
|
||||||
|
|
||||||
from _ba import (
|
from _ba import (
|
||||||
@ -81,7 +80,49 @@ from ba._collision import Collision, getcollision
|
|||||||
|
|
||||||
app: App
|
app: App
|
||||||
|
|
||||||
__all__: list[str] = []
|
__all__ = [
|
||||||
|
'Achievement', 'AchievementSubsystem', 'Activity', 'ActivityNotFoundError',
|
||||||
|
'Actor', 'ActorNotFoundError', 'animate', 'animate_array', 'app', 'App',
|
||||||
|
'AppConfig', 'AppDelegate', 'AssetPackage', 'BoolSetting', 'buttonwidget',
|
||||||
|
'Call', 'cameraflash', 'camerashake', 'Campaign', 'CelebrateMessage',
|
||||||
|
'charstr', 'checkboxwidget', 'ChoiceSetting', 'Chooser',
|
||||||
|
'clipboard_get_text', 'clipboard_has_text', 'clipboard_is_supported',
|
||||||
|
'clipboard_set_text', 'CollideModel', 'Collision', 'columnwidget',
|
||||||
|
'containerwidget', 'Context', 'ContextCall', 'ContextError',
|
||||||
|
'CoopGameActivity', 'CoopSession', 'Data', 'DeathType',
|
||||||
|
'DelegateNotFoundError', 'Dependency', 'DependencyComponent',
|
||||||
|
'DependencyError', 'DependencySet', 'DieMessage', 'do_once', 'DropMessage',
|
||||||
|
'DroppedMessage', 'DualTeamSession', 'emitfx', 'EmptyPlayer', 'EmptyTeam',
|
||||||
|
'Existable', 'existing', 'FloatChoiceSetting', 'FloatSetting',
|
||||||
|
'FreeForAllSession', 'FreezeMessage', 'GameActivity', 'GameResults',
|
||||||
|
'GameTip', 'garbage_collect', 'getactivity', 'getclass', 'getcollidemodel',
|
||||||
|
'getcollision', 'getdata', 'getmaps', 'getmodel', 'getnodes', 'getsession',
|
||||||
|
'getsound', 'gettexture', 'HitMessage', 'hscrollwidget', 'imagewidget',
|
||||||
|
'ImpactDamageMessage', 'InputDevice', 'InputDeviceNotFoundError',
|
||||||
|
'InputType', 'IntChoiceSetting', 'IntSetting',
|
||||||
|
'is_browser_likely_available', 'is_point_in_box', 'Keyboard',
|
||||||
|
'LanguageSubsystem', 'Level', 'Lobby', 'log', 'Lstr', 'Map', 'Material',
|
||||||
|
'MetadataSubsystem', 'Model', 'MultiTeamSession', 'MusicPlayer',
|
||||||
|
'MusicPlayMode', 'MusicSubsystem', 'MusicType', 'newactivity', 'newnode',
|
||||||
|
'Node', 'NodeActor', 'NodeNotFoundError', 'normalized_color',
|
||||||
|
'NotFoundError', 'open_url', 'OutOfBoundsMessage', 'Permission',
|
||||||
|
'PickedUpMessage', 'PickUpMessage', 'Player', 'PlayerDiedMessage',
|
||||||
|
'PlayerInfo', 'PlayerNotFoundError', 'PlayerRecord', 'PlayerScoredMessage',
|
||||||
|
'playsound', 'Plugin', 'PluginSubsystem', 'PotentialPlugin',
|
||||||
|
'PowerupAcceptMessage', 'PowerupMessage', 'print_error', 'print_exception',
|
||||||
|
'printnodes', 'printobjects', 'pushcall', 'quit', 'rowwidget', 'safecolor',
|
||||||
|
'ScoreConfig', 'ScoreType', 'screenmessage', 'scrollwidget',
|
||||||
|
'ServerController', 'Session', 'SessionNotFoundError', 'SessionPlayer',
|
||||||
|
'SessionPlayerNotFoundError', 'SessionTeam', 'SessionTeamNotFoundError',
|
||||||
|
'set_analytics_screen', 'setmusic', 'Setting', 'ShouldShatterMessage',
|
||||||
|
'show_damage_count', 'Sound', 'SpecialChar', 'StandLocation',
|
||||||
|
'StandMessage', 'Stats', 'storagename', 'Team', 'TeamGameActivity',
|
||||||
|
'TeamNotFoundError', 'Texture', 'textwidget', 'ThawMessage', 'time',
|
||||||
|
'TimeFormat', 'Timer', 'timer', 'timestring', 'TimeType', 'uicleanupcheck',
|
||||||
|
'UIController', 'UIScale', 'UISubsystem', 'UNHANDLED', 'Vec3',
|
||||||
|
'vec3validate', 'verify_object_death', 'WeakCall', 'Widget', 'widget',
|
||||||
|
'WidgetNotFoundError', 'Window'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
# Have these things present themselves cleanly as 'ba.Foo'
|
# Have these things present themselves cleanly as 'ba.Foo'
|
||||||
@ -89,10 +130,6 @@ __all__: list[str] = []
|
|||||||
def _simplify_module_names() -> None:
|
def _simplify_module_names() -> None:
|
||||||
import os
|
import os
|
||||||
|
|
||||||
for attr, _obj in globals().items():
|
|
||||||
if not attr.startswith('_'):
|
|
||||||
__all__.append(attr)
|
|
||||||
|
|
||||||
# Though pdoc gets confused when we override __module__,
|
# Though pdoc gets confused when we override __module__,
|
||||||
# so let's make an exception for it.
|
# so let's make an exception for it.
|
||||||
if os.environ.get('BA_DOCS_GENERATION', '0') != '1':
|
if os.environ.get('BA_DOCS_GENERATION', '0') != '1':
|
||||||
|
|||||||
@ -12,7 +12,6 @@ import _ba
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
import ba
|
|
||||||
|
|
||||||
|
|
||||||
class AccountSubsystem:
|
class AccountSubsystem:
|
||||||
|
|||||||
@ -916,7 +916,6 @@ class Achievement:
|
|||||||
|
|
||||||
def show_completion_banner(self, sound: bool = True) -> None:
|
def show_completion_banner(self, sound: bool = True) -> None:
|
||||||
"""Create the banner/sound for an acquired achievement announcement."""
|
"""Create the banner/sound for an acquired achievement announcement."""
|
||||||
from ba import _account
|
|
||||||
from ba import _gameutils
|
from ba import _gameutils
|
||||||
from bastd.actor.text import Text
|
from bastd.actor.text import Text
|
||||||
from bastd.actor.image import Image
|
from bastd.actor.image import Image
|
||||||
|
|||||||
@ -18,7 +18,6 @@ from ba._messages import UNHANDLED
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional, Any
|
from typing import Optional, Any
|
||||||
import ba
|
import ba
|
||||||
from bastd.actor.respawnicon import RespawnIcon
|
|
||||||
|
|
||||||
PlayerType = TypeVar('PlayerType', bound=Player)
|
PlayerType = TypeVar('PlayerType', bound=Player)
|
||||||
TeamType = TypeVar('TeamType', bound=Team)
|
TeamType = TypeVar('TeamType', bound=Team)
|
||||||
@ -675,6 +674,7 @@ class Activity(DependencyComponent, Generic[PlayerType, TeamType]):
|
|||||||
sessionplayer.setactivity(None)
|
sessionplayer.setactivity(None)
|
||||||
sessionplayer.activityplayer = None
|
sessionplayer.activityplayer = None
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
def _setup_player_and_team_types(self) -> None:
|
def _setup_player_and_team_types(self) -> None:
|
||||||
"""Pull player and team types from our typing.Generic params."""
|
"""Pull player and team types from our typing.Generic params."""
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@ if TYPE_CHECKING:
|
|||||||
TA = TypeVar('TA', bound='Actor')
|
TA = TypeVar('TA', bound='Actor')
|
||||||
|
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
class Actor:
|
class Actor:
|
||||||
"""High level logical entities in a ba.Activity.
|
"""High level logical entities in a ba.Activity.
|
||||||
|
|
||||||
|
|||||||
@ -285,11 +285,9 @@ class App:
|
|||||||
"""Runs after the app finishes bootstrapping.
|
"""Runs after the app finishes bootstrapping.
|
||||||
|
|
||||||
(internal)"""
|
(internal)"""
|
||||||
# pylint: disable=too-many-locals
|
|
||||||
# pylint: disable=cyclic-import
|
# pylint: disable=cyclic-import
|
||||||
from ba import _apputils
|
from ba import _apputils
|
||||||
from ba import _appconfig
|
from ba import _appconfig
|
||||||
from ba import _achievement
|
|
||||||
from ba import _map
|
from ba import _map
|
||||||
from ba import _campaign
|
from ba import _campaign
|
||||||
from bastd import appdelegate
|
from bastd import appdelegate
|
||||||
@ -429,7 +427,6 @@ class App:
|
|||||||
activity: Optional[ba.Activity] = _ba.get_foreground_host_activity()
|
activity: Optional[ba.Activity] = _ba.get_foreground_host_activity()
|
||||||
if (activity is not None and activity.allow_pausing
|
if (activity is not None and activity.allow_pausing
|
||||||
and not _ba.have_connected_clients()):
|
and not _ba.have_connected_clients()):
|
||||||
from ba import _gameutils
|
|
||||||
from ba._language import Lstr
|
from ba._language import Lstr
|
||||||
from ba._nodeactor import NodeActor
|
from ba._nodeactor import NodeActor
|
||||||
|
|
||||||
|
|||||||
@ -236,6 +236,7 @@ class CoopSession(Session):
|
|||||||
with _ba.Context(activity):
|
with _ba.Context(activity):
|
||||||
activity.end(results={'outcome': 'restart'}, force=True)
|
activity.end(results={'outcome': 'restart'}, force=True)
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
def on_activity_end(self, activity: ba.Activity, results: Any) -> None:
|
def on_activity_end(self, activity: ba.Activity, results: Any) -> None:
|
||||||
"""Method override for co-op sessions.
|
"""Method override for co-op sessions.
|
||||||
|
|
||||||
|
|||||||
@ -258,6 +258,7 @@ class GameActivity(Activity[PlayerType, TeamType]):
|
|||||||
"""Return a name for this particular game instance."""
|
"""Return a name for this particular game instance."""
|
||||||
return self.get_display_string(self.settings_raw)
|
return self.get_display_string(self.settings_raw)
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
def get_instance_scoreboard_display_string(self) -> ba.Lstr:
|
def get_instance_scoreboard_display_string(self) -> ba.Lstr:
|
||||||
"""Return a name for this particular game instance.
|
"""Return a name for this particular game instance.
|
||||||
|
|
||||||
|
|||||||
@ -98,6 +98,7 @@ def animate(node: ba.Node,
|
|||||||
# FIXME: Even if we are looping we should have a way to die once we
|
# FIXME: Even if we are looping we should have a way to die once we
|
||||||
# get disconnected.
|
# get disconnected.
|
||||||
if not loop:
|
if not loop:
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
_ba.timer(int(mult * items[-1][0]) + 1000,
|
_ba.timer(int(mult * items[-1][0]) + 1000,
|
||||||
curve.delete,
|
curve.delete,
|
||||||
timeformat=TimeFormat.MILLISECONDS)
|
timeformat=TimeFormat.MILLISECONDS)
|
||||||
@ -178,6 +179,7 @@ def animate_array(node: ba.Node,
|
|||||||
# curve after its done its job.
|
# curve after its done its job.
|
||||||
if not loop:
|
if not loop:
|
||||||
# (PyCharm seems to think item is a float, not a tuple)
|
# (PyCharm seems to think item is a float, not a tuple)
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
_ba.timer(int(mult * items[-1][0]) + 1000,
|
_ba.timer(int(mult * items[-1][0]) + 1000,
|
||||||
curve.delete,
|
curve.delete,
|
||||||
timeformat=TimeFormat.MILLISECONDS)
|
timeformat=TimeFormat.MILLISECONDS)
|
||||||
@ -189,6 +191,7 @@ def animate_array(node: ba.Node,
|
|||||||
# once we get disconnected.
|
# once we get disconnected.
|
||||||
if not loop:
|
if not loop:
|
||||||
# (PyCharm seems to think item is a float, not a tuple)
|
# (PyCharm seems to think item is a float, not a tuple)
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
_ba.timer(int(mult * items[-1][0]) + 1000,
|
_ba.timer(int(mult * items[-1][0]) + 1000,
|
||||||
combine.delete,
|
combine.delete,
|
||||||
timeformat=TimeFormat.MILLISECONDS)
|
timeformat=TimeFormat.MILLISECONDS)
|
||||||
|
|||||||
@ -137,6 +137,7 @@ def get_type_name(cls: type) -> str:
|
|||||||
return cls.__module__ + '.' + cls.__name__
|
return cls.__module__ + '.' + cls.__name__
|
||||||
|
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
class _WeakCall:
|
class _WeakCall:
|
||||||
"""Wrap a callable and arguments into a single callable object.
|
"""Wrap a callable and arguments into a single callable object.
|
||||||
|
|
||||||
@ -225,6 +226,7 @@ class _Call:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, *args: Any, **keywds: Any):
|
def __init__(self, *args: Any, **keywds: Any):
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
"""Instantiate a Call.
|
"""Instantiate a Call.
|
||||||
|
|
||||||
Pass a callable as the first arg, followed by any number of
|
Pass a callable as the first arg, followed by any number of
|
||||||
@ -360,6 +362,7 @@ def _verify_object_death(wref: weakref.ref) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def storagename(suffix: str = None) -> str:
|
def storagename(suffix: str = None) -> str:
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
"""Generate a unique name for storing class data in shared places.
|
"""Generate a unique name for storing class data in shared places.
|
||||||
|
|
||||||
Category: **General Utility Functions**
|
Category: **General Utility Functions**
|
||||||
|
|||||||
@ -364,6 +364,7 @@ class LanguageSubsystem:
|
|||||||
return 0xE000 <= ord(char) <= 0xF8FF
|
return 0xE000 <= ord(char) <= 0xF8FF
|
||||||
|
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
class Lstr:
|
class Lstr:
|
||||||
"""Used to define strings in a language-independent way.
|
"""Used to define strings in a language-independent way.
|
||||||
|
|
||||||
|
|||||||
@ -410,6 +410,7 @@ class Chooser:
|
|||||||
self._profileindex = self._profilenames.index(self._profilename)
|
self._profileindex = self._profilenames.index(self._profilename)
|
||||||
else:
|
else:
|
||||||
self._profileindex = 0
|
self._profileindex = 0
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
self._profilename = self._profilenames[self._profileindex]
|
self._profilename = self._profilenames[self._profileindex]
|
||||||
|
|
||||||
def update_position(self) -> None:
|
def update_position(self) -> None:
|
||||||
|
|||||||
@ -189,7 +189,6 @@ class Map(Actor):
|
|||||||
def __init__(self,
|
def __init__(self,
|
||||||
vr_overlay_offset: Optional[Sequence[float]] = None) -> None:
|
vr_overlay_offset: Optional[Sequence[float]] = None) -> None:
|
||||||
"""Instantiate a map."""
|
"""Instantiate a map."""
|
||||||
from ba import _gameutils
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
# This is expected to always be a ba.Node object (whether valid or not)
|
# This is expected to always be a ba.Node object (whether valid or not)
|
||||||
|
|||||||
@ -485,7 +485,6 @@ def setmusic(musictype: Optional[ba.MusicType],
|
|||||||
if 'continuous' is True and musictype is the same as what is already
|
if 'continuous' is True and musictype is the same as what is already
|
||||||
playing, the playing track will not be restarted.
|
playing, the playing track will not be restarted.
|
||||||
"""
|
"""
|
||||||
from ba import _gameutils
|
|
||||||
|
|
||||||
# All we do here now is set a few music attrs on the current globals
|
# All we do here now is set a few music attrs on the current globals
|
||||||
# node. The foreground globals' current playing music then gets fed to
|
# node. The foreground globals' current playing music then gets fed to
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import _ba
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Union, Callable, Optional
|
from typing import Any, Union, Callable, Optional
|
||||||
import socket
|
import socket
|
||||||
import ba
|
|
||||||
MasterServerCallback = Callable[[Union[None, dict[str, Any]]], None]
|
MasterServerCallback = Callable[[Union[None, dict[str, Any]]], None]
|
||||||
|
|
||||||
# Timeout for standard functions talking to the master-server/etc.
|
# Timeout for standard functions talking to the master-server/etc.
|
||||||
@ -106,7 +105,7 @@ class MasterServerCallThread(threading.Thread):
|
|||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
# pylint: disable=too-many-branches, consider-using-with
|
# pylint: disable=too-many-branches, consider-using-with
|
||||||
import urllib.request
|
import urllib.request
|
||||||
import urllib.error
|
import urllib.parse
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from efro.error import is_urllib_network_error
|
from efro.error import is_urllib_network_error
|
||||||
@ -114,19 +113,19 @@ class MasterServerCallThread(threading.Thread):
|
|||||||
try:
|
try:
|
||||||
self._data = _general.utf8_all(self._data)
|
self._data = _general.utf8_all(self._data)
|
||||||
_ba.set_thread_name('BA_ServerCallThread')
|
_ba.set_thread_name('BA_ServerCallThread')
|
||||||
parse = urllib.parse
|
|
||||||
if self._request_type == 'get':
|
if self._request_type == 'get':
|
||||||
response = urllib.request.urlopen(
|
response = urllib.request.urlopen(
|
||||||
urllib.request.Request(
|
urllib.request.Request(
|
||||||
(_ba.get_master_server_address() + '/' +
|
(_ba.get_master_server_address() + '/' +
|
||||||
self._request + '?' + parse.urlencode(self._data)),
|
self._request + '?' +
|
||||||
None, {'User-Agent': _ba.app.user_agent_string}),
|
urllib.parse.urlencode(self._data)), None,
|
||||||
|
{'User-Agent': _ba.app.user_agent_string}),
|
||||||
timeout=DEFAULT_REQUEST_TIMEOUT_SECONDS)
|
timeout=DEFAULT_REQUEST_TIMEOUT_SECONDS)
|
||||||
elif self._request_type == 'post':
|
elif self._request_type == 'post':
|
||||||
response = urllib.request.urlopen(
|
response = urllib.request.urlopen(
|
||||||
urllib.request.Request(
|
urllib.request.Request(
|
||||||
_ba.get_master_server_address() + '/' + self._request,
|
_ba.get_master_server_address() + '/' + self._request,
|
||||||
parse.urlencode(self._data).encode(),
|
urllib.parse.urlencode(self._data).encode(),
|
||||||
{'User-Agent': _ba.app.user_agent_string}),
|
{'User-Agent': _ba.app.user_agent_string}),
|
||||||
timeout=DEFAULT_REQUEST_TIMEOUT_SECONDS)
|
timeout=DEFAULT_REQUEST_TIMEOUT_SECONDS)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -7,8 +7,6 @@ or disappear without warning, so should be avoided (or used sparingly and
|
|||||||
defensively) in mods.
|
defensively) in mods.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# pylint: disable=unused-import
|
|
||||||
|
|
||||||
from ba._map import (get_unowned_maps, get_map_class, register_map,
|
from ba._map import (get_unowned_maps, get_map_class, register_map,
|
||||||
preload_map_preview_media, get_map_display_string,
|
preload_map_preview_media, get_map_display_string,
|
||||||
get_filtered_map_name)
|
get_filtered_map_name)
|
||||||
@ -39,3 +37,24 @@ from ba._store import (get_available_sale_time, get_available_purchase_count,
|
|||||||
get_store_item, get_clean_price)
|
get_store_item, get_clean_price)
|
||||||
from ba._tournament import get_tournament_prize_strings
|
from ba._tournament import get_tournament_prize_strings
|
||||||
from ba._gameutils import get_trophy_string
|
from ba._gameutils import get_trophy_string
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
'get_unowned_maps', 'get_map_class', 'register_map',
|
||||||
|
'preload_map_preview_media', 'get_map_display_string',
|
||||||
|
'get_filtered_map_name', 'commit_app_config', 'get_device_value',
|
||||||
|
'get_input_map_hash', 'get_input_device_config', 'getclass', 'json_prep',
|
||||||
|
'get_type_name', 'JoinActivity', 'ScoreScreenActivity',
|
||||||
|
'is_browser_likely_available', 'get_remote_app_name',
|
||||||
|
'should_submit_debug_info', 'run_gpu_benchmark', 'run_cpu_benchmark',
|
||||||
|
'run_media_reload_benchmark', 'run_stress_test', 'getcampaign',
|
||||||
|
'PlayerProfilesChangedMessage', 'DEFAULT_TEAM_COLORS',
|
||||||
|
'DEFAULT_TEAM_NAMES', 'do_play_music', 'master_server_get',
|
||||||
|
'master_server_post', 'get_ip_address_type',
|
||||||
|
'DEFAULT_REQUEST_TIMEOUT_SECONDS', 'get_default_powerup_distribution',
|
||||||
|
'get_player_profile_colors', 'get_player_profile_icon',
|
||||||
|
'get_player_colors', 'get_next_tip', 'get_default_free_for_all_playlist',
|
||||||
|
'get_default_teams_playlist', 'filter_playlist', 'get_available_sale_time',
|
||||||
|
'get_available_purchase_count', 'get_store_item_name_translated',
|
||||||
|
'get_store_item_display_size', 'get_store_layout', 'get_store_item',
|
||||||
|
'get_clean_price', 'get_tournament_prize_strings', 'get_trophy_string'
|
||||||
|
]
|
||||||
|
|||||||
@ -841,6 +841,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]):
|
|||||||
if display_scores[i][1] is None:
|
if display_scores[i][1] is None:
|
||||||
name_str = '-'
|
name_str = '-'
|
||||||
else:
|
else:
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
name_str = ', '.join([
|
name_str = ', '.join([
|
||||||
p['name'] for p in display_scores[i][1]['players']
|
p['name'] for p in display_scores[i][1]['players']
|
||||||
])
|
])
|
||||||
|
|||||||
@ -94,6 +94,7 @@ class MultiTeamScoreScreenActivity(ScoreScreenActivity):
|
|||||||
assert self.stats
|
assert self.stats
|
||||||
valid_players = list(self.stats.get_records().items())
|
valid_players = list(self.stats.get_records().items())
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
def _get_player_score_set_entry(
|
def _get_player_score_set_entry(
|
||||||
player: ba.SessionPlayer) -> Optional[ba.PlayerRecord]:
|
player: ba.SessionPlayer) -> Optional[ba.PlayerRecord]:
|
||||||
for p_rec in valid_players:
|
for p_rec in valid_players:
|
||||||
|
|||||||
@ -16,7 +16,6 @@ from bastd.gameutils import SharedObjects
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Sequence, Optional, Union, Callable
|
from typing import Any, Sequence, Optional, Union, Callable
|
||||||
from bastd.actor.spazfactory import SpazFactory
|
|
||||||
|
|
||||||
POWERUP_WEAR_OFF_TIME = 20000
|
POWERUP_WEAR_OFF_TIME = 20000
|
||||||
BASE_PUNCH_COOLDOWN = 400
|
BASE_PUNCH_COOLDOWN = 400
|
||||||
|
|||||||
@ -51,6 +51,7 @@ class Point(Enum):
|
|||||||
@dataclass
|
@dataclass
|
||||||
class Spawn:
|
class Spawn:
|
||||||
"""Defines a bot spawn event."""
|
"""Defines a bot spawn event."""
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
type: type[SpazBot]
|
type: type[SpazBot]
|
||||||
path: int = 0
|
path: int = 0
|
||||||
point: Optional[Point] = None
|
point: Optional[Point] = None
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import ba
|
|||||||
import _ba
|
import _ba
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Optional
|
pass
|
||||||
|
|
||||||
|
|
||||||
class V2SignInWindow(ba.Window):
|
class V2SignInWindow(ba.Window):
|
||||||
|
|||||||
@ -249,6 +249,7 @@ class ColorPickerExact(PopupWindow):
|
|||||||
# color to the delegate, so start doing that.
|
# color to the delegate, so start doing that.
|
||||||
self._update_for_color()
|
self._update_for_color()
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
def _update_for_color(self) -> None:
|
def _update_for_color(self) -> None:
|
||||||
if not self.root_widget:
|
if not self.root_widget:
|
||||||
return
|
return
|
||||||
|
|||||||
@ -269,6 +269,7 @@ class CoopBrowserWindow(ba.Window):
|
|||||||
repeat=True)
|
repeat=True)
|
||||||
self._update()
|
self._update()
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _preload_modules() -> None:
|
def _preload_modules() -> None:
|
||||||
"""Preload modules we use (called in bg thread)."""
|
"""Preload modules we use (called in bg thread)."""
|
||||||
|
|||||||
@ -17,7 +17,6 @@ import ba
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Optional, Union, Callable
|
from typing import Any, Optional, Union, Callable
|
||||||
from bastd.ui.gather import GatherWindow
|
from bastd.ui.gather import GatherWindow
|
||||||
from bastd.ui.confirm import ConfirmWindow
|
|
||||||
|
|
||||||
|
|
||||||
def _safe_set_text(txt: Optional[ba.Widget],
|
def _safe_set_text(txt: Optional[ba.Widget],
|
||||||
|
|||||||
@ -76,6 +76,7 @@ class MainMenuWindow(ba.Window):
|
|||||||
repeat=True,
|
repeat=True,
|
||||||
timetype=ba.TimeType.REAL)
|
timetype=ba.TimeType.REAL)
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _preload_modules() -> None:
|
def _preload_modules() -> None:
|
||||||
"""Preload modules we use (called in bg thread)."""
|
"""Preload modules we use (called in bg thread)."""
|
||||||
|
|||||||
@ -341,6 +341,7 @@ class PartyQueueWindow(ba.Window):
|
|||||||
self._dudes_by_id[enemy_id].claimed = True
|
self._dudes_by_id[enemy_id].claimed = True
|
||||||
|
|
||||||
# remove unclaimed dudes from both of our lists
|
# remove unclaimed dudes from both of our lists
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
self._dudes_by_id = dict([
|
self._dudes_by_id = dict([
|
||||||
item for item in list(self._dudes_by_id.items()) if item[1].claimed
|
item for item in list(self._dudes_by_id.items()) if item[1].claimed
|
||||||
])
|
])
|
||||||
|
|||||||
@ -417,6 +417,7 @@ class PlayWindow(ba.Window):
|
|||||||
|
|
||||||
self._restore_state()
|
self._restore_state()
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _preload_modules() -> None:
|
def _preload_modules() -> None:
|
||||||
"""Preload modules we use (called in bg thread)."""
|
"""Preload modules we use (called in bg thread)."""
|
||||||
|
|||||||
@ -149,6 +149,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||||||
master_server_get('bsLangGetCompleted', {'b': app.build_number},
|
master_server_get('bsLangGetCompleted', {'b': app.build_number},
|
||||||
callback=ba.WeakCall(self._completed_langs_cb))
|
callback=ba.WeakCall(self._completed_langs_cb))
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _preload_modules() -> None:
|
def _preload_modules() -> None:
|
||||||
"""Preload modules we use (called in bg thread)."""
|
"""Preload modules we use (called in bg thread)."""
|
||||||
|
|||||||
@ -187,6 +187,7 @@ class AllSettingsWindow(ba.Window):
|
|||||||
draw_controller=avb)
|
draw_controller=avb)
|
||||||
self._restore_state()
|
self._restore_state()
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _preload_modules() -> None:
|
def _preload_modules() -> None:
|
||||||
"""Preload modules we use (called in bg thread)."""
|
"""Preload modules we use (called in bg thread)."""
|
||||||
|
|||||||
@ -15,22 +15,19 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</header>
|
</header>
|
||||||
<main class="pdoc">
|
<main class="pdoc">
|
||||||
<h1>Welcome to Ballistica Documentations!</h1>
|
<h1>Welcome to Ballistica Documentation!</h1>
|
||||||
<i>Last updated for Ballistica {{ ba_version }}
|
<i>Last updated for Ballistica {{ ba_version }}
|
||||||
(build {{ ba_build }})</i>
|
(build {{ ba_build }})</i>
|
||||||
<hr/>
|
<hr/>
|
||||||
<p>
|
<p>
|
||||||
Here you can find information about Python classes/functions
|
Here you can find information about Python classes/functions
|
||||||
used by Ballistica.
|
used by Ballistica.
|
||||||
Fell free to create an
|
Feel free to create an
|
||||||
<a href="https://github.com/efroemling/ballistica/issues/">
|
<a href="https://github.com/efroemling/ballistica/issues/">
|
||||||
issue</a>
|
issue</a>
|
||||||
or send a
|
or send a
|
||||||
<a href="https://github.com/efroemling/ballistica/pulls/">PR</a>
|
<a href="https://github.com/efroemling/ballistica/pulls/">PR</a>
|
||||||
if something in this docs feels incorrect or can be improved.
|
if something in this docs feels incorrect or can be improved.
|
||||||
Note that <code>bastd</code>'s docs may look a little terrible
|
|
||||||
right
|
|
||||||
now, hope that's temporary. :)
|
|
||||||
</p>
|
</p>
|
||||||
</main>
|
</main>
|
||||||
{% if search %}
|
{% if search %}
|
||||||
|
|||||||
11
ballisticacore-cmake/.idea/dictionaries/ericf.xml
generated
11
ballisticacore-cmake/.idea/dictionaries/ericf.xml
generated
@ -88,6 +88,7 @@
|
|||||||
<w>bametainternal</w>
|
<w>bametainternal</w>
|
||||||
<w>barebones</w>
|
<w>barebones</w>
|
||||||
<w>baseaddr</w>
|
<w>baseaddr</w>
|
||||||
|
<w>baseimps</w>
|
||||||
<w>basetype</w>
|
<w>basetype</w>
|
||||||
<w>basicsize</w>
|
<w>basicsize</w>
|
||||||
<w>basn</w>
|
<w>basn</w>
|
||||||
@ -293,6 +294,7 @@
|
|||||||
<w>dfmt</w>
|
<w>dfmt</w>
|
||||||
<w>dictval</w>
|
<w>dictval</w>
|
||||||
<w>diffbit</w>
|
<w>diffbit</w>
|
||||||
|
<w>dirfilter</w>
|
||||||
<w>dirslash</w>
|
<w>dirslash</w>
|
||||||
<w>dlfcn</w>
|
<w>dlfcn</w>
|
||||||
<w>dlife</w>
|
<w>dlife</w>
|
||||||
@ -331,6 +333,7 @@
|
|||||||
<w>efrocaching</w>
|
<w>efrocaching</w>
|
||||||
<w>efrohack</w>
|
<w>efrohack</w>
|
||||||
<w>efrohome</w>
|
<w>efrohome</w>
|
||||||
|
<w>efrotoolsinternal</w>
|
||||||
<w>elapsedf</w>
|
<w>elapsedf</w>
|
||||||
<w>elems</w>
|
<w>elems</w>
|
||||||
<w>elevenbase</w>
|
<w>elevenbase</w>
|
||||||
@ -339,9 +342,11 @@
|
|||||||
<w>emitfx</w>
|
<w>emitfx</w>
|
||||||
<w>emojis</w>
|
<w>emojis</w>
|
||||||
<w>enablexinput</w>
|
<w>enablexinput</w>
|
||||||
|
<w>endblock</w>
|
||||||
<w>endcall</w>
|
<w>endcall</w>
|
||||||
<w>endl</w>
|
<w>endl</w>
|
||||||
<w>endline</w>
|
<w>endline</w>
|
||||||
|
<w>endmacro</w>
|
||||||
<w>endtime</w>
|
<w>endtime</w>
|
||||||
<w>entrypoint</w>
|
<w>entrypoint</w>
|
||||||
<w>enumvaltype</w>
|
<w>enumvaltype</w>
|
||||||
@ -400,8 +405,10 @@
|
|||||||
<w>fieldname</w>
|
<w>fieldname</w>
|
||||||
<w>fieldpath</w>
|
<w>fieldpath</w>
|
||||||
<w>fifteenbits</w>
|
<w>fifteenbits</w>
|
||||||
|
<w>filefilter</w>
|
||||||
<w>filelock</w>
|
<w>filelock</w>
|
||||||
<w>filt</w>
|
<w>filt</w>
|
||||||
|
<w>filterdoc</w>
|
||||||
<w>filterstr</w>
|
<w>filterstr</w>
|
||||||
<w>filterval</w>
|
<w>filterval</w>
|
||||||
<w>finishedptr</w>
|
<w>finishedptr</w>
|
||||||
@ -855,6 +862,7 @@
|
|||||||
<w>pausable</w>
|
<w>pausable</w>
|
||||||
<w>pcommands</w>
|
<w>pcommands</w>
|
||||||
<w>pdataclass</w>
|
<w>pdataclass</w>
|
||||||
|
<w>pdoc</w>
|
||||||
<w>pdst</w>
|
<w>pdst</w>
|
||||||
<w>peername</w>
|
<w>peername</w>
|
||||||
<w>persp</w>
|
<w>persp</w>
|
||||||
@ -964,6 +972,7 @@
|
|||||||
<w>realtimers</w>
|
<w>realtimers</w>
|
||||||
<w>recalc</w>
|
<w>recalc</w>
|
||||||
<w>recursed</w>
|
<w>recursed</w>
|
||||||
|
<w>recursing</w>
|
||||||
<w>recv</w>
|
<w>recv</w>
|
||||||
<w>recvfrom</w>
|
<w>recvfrom</w>
|
||||||
<w>redundants</w>
|
<w>redundants</w>
|
||||||
@ -1003,6 +1012,7 @@
|
|||||||
<w>rspdata</w>
|
<w>rspdata</w>
|
||||||
<w>rsplen</w>
|
<w>rsplen</w>
|
||||||
<w>rspobj</w>
|
<w>rspobj</w>
|
||||||
|
<w>rsptypes</w>
|
||||||
<w>rtest</w>
|
<w>rtest</w>
|
||||||
<w>rtypes</w>
|
<w>rtypes</w>
|
||||||
<w>rtypevar</w>
|
<w>rtypevar</w>
|
||||||
@ -1089,6 +1099,7 @@
|
|||||||
<w>srcid</w>
|
<w>srcid</w>
|
||||||
<w>srcname</w>
|
<w>srcname</w>
|
||||||
<w>srcpath</w>
|
<w>srcpath</w>
|
||||||
|
<w>srcpaths</w>
|
||||||
<w>srcsz</w>
|
<w>srcsz</w>
|
||||||
<w>sresult</w>
|
<w>sresult</w>
|
||||||
<w>sscanf</w>
|
<w>sscanf</w>
|
||||||
|
|||||||
@ -21,8 +21,8 @@
|
|||||||
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 kAppBuildNumber = 20510;
|
const int kAppBuildNumber = 20514;
|
||||||
const char* kAppVersion = "1.6.10";
|
const char* kAppVersion = "1.6.11";
|
||||||
|
|
||||||
// Our standalone globals.
|
// Our standalone globals.
|
||||||
// These are separated out for easy access.
|
// These are separated out for easy access.
|
||||||
|
|||||||
@ -5,7 +5,9 @@ PCOMMAND = ../../tools/pcommand
|
|||||||
all: sources
|
all: sources
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf ../ballistica/generated ../../assets/src/ba_data/python/ba/_generated bametainternal/generated
|
rm -rf ../ballistica/generated \
|
||||||
|
../../assets/src/ba_data/python/ba/_generated \
|
||||||
|
bametainternal/generated
|
||||||
|
|
||||||
|
|
||||||
# This section is generated by batools.metamakefile; do not edit by hand.
|
# This section is generated by batools.metamakefile; do not edit by hand.
|
||||||
@ -17,10 +19,10 @@ sources: \
|
|||||||
../ballistica/generated/python_embedded/binding.inc \
|
../ballistica/generated/python_embedded/binding.inc \
|
||||||
../ballistica/generated/python_embedded/bootstrap.inc
|
../ballistica/generated/python_embedded/bootstrap.inc
|
||||||
|
|
||||||
../ballistica/generated/python_embedded/binding.inc : bameta/python_embedded/binding.py ../../tools/batools/meta.py
|
../ballistica/generated/python_embedded/binding.inc : bameta/python_embedded/binding.py
|
||||||
@$(PCOMMAND) gen_binding_code $< $@
|
@$(PCOMMAND) gen_binding_code $< $@
|
||||||
|
|
||||||
../ballistica/generated/python_embedded/bootstrap.inc : bameta/python_embedded/bootstrap.py ../../tools/batools/meta.py
|
../ballistica/generated/python_embedded/bootstrap.inc : bameta/python_embedded/bootstrap.py
|
||||||
@$(PCOMMAND) gen_flat_data_code $< $@ bootstrap_code
|
@$(PCOMMAND) gen_flat_data_code $< $@ bootstrap_code
|
||||||
|
|
||||||
../../assets/src/ba_data/python/ba/_generated/__init__.py : ../../tools/batools/pcommand.py
|
../../assets/src/ba_data/python/ba/_generated/__init__.py : ../../tools/batools/pcommand.py
|
||||||
|
|||||||
@ -140,6 +140,7 @@ if (_ba.contains_python_dist()
|
|||||||
|
|
||||||
if debug_build:
|
if debug_build:
|
||||||
|
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
def _thread_func() -> None:
|
def _thread_func() -> None:
|
||||||
# pylint: disable=unused-import
|
# pylint: disable=unused-import
|
||||||
import json
|
import json
|
||||||
|
|||||||
@ -19,7 +19,7 @@ from efro.error import CommunicationError
|
|||||||
from efro.dataclassio import ioprepped, dataclass_from_json, dataclass_to_json
|
from efro.dataclassio import ioprepped, dataclass_from_json, dataclass_to_json
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional, Awaitable, Callable
|
from typing import Optional, Awaitable
|
||||||
|
|
||||||
ADDR = '127.0.0.1'
|
ADDR = '127.0.0.1'
|
||||||
# Randomize this a bit to avoid failing on parallel testing.
|
# Randomize this a bit to avoid failing on parallel testing.
|
||||||
|
|||||||
@ -16,7 +16,6 @@ from efrotools import PYVER
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
# Suffix for the pyc files we include in stagings.
|
# Suffix for the pyc files we include in stagings.
|
||||||
# We're using deterministic opt pyc files; see PEP 552.
|
# We're using deterministic opt pyc files; see PEP 552.
|
||||||
|
|||||||
@ -8,12 +8,13 @@ import sys
|
|||||||
import datetime
|
import datetime
|
||||||
import subprocess
|
import subprocess
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from pathlib import Path
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from efro.util import assert_never
|
||||||
from efro.error import CleanError
|
from efro.error import CleanError
|
||||||
from efro.terminal import Clr
|
from efro.terminal import Clr
|
||||||
|
from efrotools.build import Lazybuild
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Sequence, Optional, Any
|
from typing import Sequence, Optional, Any
|
||||||
@ -80,15 +81,6 @@ SPARSE_TEST_BUILDS: list[list[str]] = [
|
|||||||
DO_SPARSE_TEST_BUILDS = 'ballistica' + 'core' == 'ballisticacore'
|
DO_SPARSE_TEST_BUILDS = 'ballistica' + 'core' == 'ballisticacore'
|
||||||
|
|
||||||
|
|
||||||
class SourceCategory(Enum):
|
|
||||||
"""Types of sources."""
|
|
||||||
RESOURCES = 'resources_src'
|
|
||||||
META = 'meta_src'
|
|
||||||
ASSETS = 'assets_src'
|
|
||||||
CMAKE = 'cmake_src'
|
|
||||||
WIN = 'win_src'
|
|
||||||
|
|
||||||
|
|
||||||
class PrefabTarget(Enum):
|
class PrefabTarget(Enum):
|
||||||
"""Types of prefab builds able to be run."""
|
"""Types of prefab builds able to be run."""
|
||||||
GUI_DEBUG = 'gui-debug'
|
GUI_DEBUG = 'gui-debug'
|
||||||
@ -97,130 +89,91 @@ class PrefabTarget(Enum):
|
|||||||
SERVER_RELEASE = 'server-release'
|
SERVER_RELEASE = 'server-release'
|
||||||
|
|
||||||
|
|
||||||
def _lazybuild_check_paths(inpaths: list[str], category: SourceCategory,
|
class LazyBuildCategory(Enum):
|
||||||
target: str) -> bool:
|
"""Types of sources."""
|
||||||
# pylint: disable=too-many-branches
|
RESOURCES = 'resources_src'
|
||||||
|
META = 'meta_src'
|
||||||
mtime = None if not os.path.exists(target) else os.path.getmtime(target)
|
CMAKE = 'cmake_src'
|
||||||
|
WIN = 'win_src'
|
||||||
if target.startswith('.cache/lazybuild/'):
|
|
||||||
tnamepretty = target[len('.cache/lazybuild/'):]
|
|
||||||
else:
|
|
||||||
tnamepretty = target
|
|
||||||
|
|
||||||
def _testpath(path: str) -> bool:
|
|
||||||
# Now see this path is newer than our target..
|
|
||||||
if mtime is None or os.path.getmtime(path) >= mtime:
|
|
||||||
print(f'{Clr.SMAG}Build of {tnamepretty} triggered by change in'
|
|
||||||
f" '{path}'{Clr.RST}")
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
unchanged_count = 0
|
|
||||||
for inpath in inpaths:
|
|
||||||
# Add files verbatim; recurse through dirs.
|
|
||||||
if os.path.isfile(inpath):
|
|
||||||
if _testpath(inpath):
|
|
||||||
return True
|
|
||||||
unchanged_count += 1
|
|
||||||
continue
|
|
||||||
for root, _dnames, fnames in os.walk(inpath):
|
|
||||||
|
|
||||||
# Only the meta category uses meta src.
|
|
||||||
if (root.startswith('src/meta')
|
|
||||||
and category is not SourceCategory.META):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# None of our targets use tools-src.
|
|
||||||
if root.startswith('src/tools'):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Skip most of external except for key cases.
|
|
||||||
if root.startswith('src/external'):
|
|
||||||
if category is SourceCategory.WIN and root.startswith(
|
|
||||||
'src/external/windows'):
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Ignore python cache files.
|
|
||||||
if '__pycache__' in root:
|
|
||||||
continue
|
|
||||||
|
|
||||||
for fname in fnames:
|
|
||||||
# Ignore dot files
|
|
||||||
if fname.startswith('.'):
|
|
||||||
continue
|
|
||||||
fpath = os.path.join(root, fname)
|
|
||||||
if ' ' in fpath:
|
|
||||||
raise RuntimeError(f'Invalid path with space: {fpath}')
|
|
||||||
|
|
||||||
if _testpath(fpath):
|
|
||||||
return True
|
|
||||||
unchanged_count += 1
|
|
||||||
print(f'{Clr.BLU}Lazybuild: skipping "{tnamepretty}"'
|
|
||||||
f' ({unchanged_count} inputs unchanged).{Clr.RST}')
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def lazybuild(target: str, category: SourceCategory, command: str) -> None:
|
def lazybuild(target: str, category: LazyBuildCategory, command: str) -> None:
|
||||||
"""Run a build if anything in some category is newer than a target.
|
"""Run some lazybuild presets."""
|
||||||
|
|
||||||
This can be used as an optimization for build targets that *always* run.
|
|
||||||
As an example, a target that spins up a VM and runs a build can be
|
|
||||||
expensive even if the VM build process determines that nothing has changed
|
|
||||||
and does no work. We can use this to examine a broad swath of source files
|
|
||||||
and skip firing up the VM if nothing has changed. We can be overly broad
|
|
||||||
in the sources we look at since the worst result of a false positive change
|
|
||||||
is the VM spinning up and determining that no actual inputs have changed.
|
|
||||||
We could recreate this mechanism purely in the Makefile, but large numbers
|
|
||||||
of target sources can add significant overhead each time the Makefile is
|
|
||||||
invoked; in our case the cost is only incurred when a build is triggered.
|
|
||||||
|
|
||||||
Note that target's mod-time will *always* be updated to match the newest
|
|
||||||
source regardless of whether the build itself was triggered.
|
|
||||||
"""
|
|
||||||
paths: list[str]
|
|
||||||
|
|
||||||
# Everything possibly affecting meta builds.
|
# Everything possibly affecting meta builds.
|
||||||
if category is SourceCategory.META:
|
if category is LazyBuildCategory.META:
|
||||||
paths = [
|
Lazybuild(
|
||||||
'Makefile', 'tools/batoolsinternal/meta.py',
|
target=target,
|
||||||
'tools/batoolsinternal/pcommand.py', 'tools/batools/meta.py',
|
srcpaths=[
|
||||||
'tools/batools/pcommand.py', 'src/meta',
|
'Makefile',
|
||||||
'tools/batools/pythonenumsmodule.py', 'src/ballistica/core/types.h'
|
'src/meta',
|
||||||
]
|
'src/ballistica/core/types.h',
|
||||||
|
],
|
||||||
# Everything possibly affecting asset builds.
|
command=command,
|
||||||
elif category is SourceCategory.ASSETS:
|
# Our meta Makefile targets generally don't list tools scripts
|
||||||
paths = ['Makefile', 'tools/pcommand', 'convert_util', 'assets/src']
|
# that can affect their creation as sources, so let's set up
|
||||||
|
# a catch-all here: when any of our tools stuff changes let's
|
||||||
|
# blow away any existing meta builds.
|
||||||
|
srcpaths_fullclean=[
|
||||||
|
'tools/efrotools',
|
||||||
|
'tools/efrotoolsinternal',
|
||||||
|
'tools/batools',
|
||||||
|
'tools/batoolsinternal',
|
||||||
|
],
|
||||||
|
command_fullclean='make meta-clean',
|
||||||
|
).run()
|
||||||
|
|
||||||
# Everything possibly affecting CMake builds.
|
# Everything possibly affecting CMake builds.
|
||||||
elif category is SourceCategory.CMAKE:
|
elif category is LazyBuildCategory.CMAKE:
|
||||||
paths = ['Makefile', 'src', 'ballisticacore-cmake/CMakeLists.txt']
|
Lazybuild(
|
||||||
|
target=target,
|
||||||
|
srcpaths=[
|
||||||
|
'Makefile',
|
||||||
|
'src',
|
||||||
|
'ballisticacore-cmake/CMakeLists.txt',
|
||||||
|
],
|
||||||
|
dirfilter=(lambda root, dirname: not (
|
||||||
|
root == 'src' and dirname in {'meta', 'tools', 'external'})),
|
||||||
|
command=command,
|
||||||
|
).run()
|
||||||
|
|
||||||
# Everything possibly affecting Windows binary builds.
|
# Everything possibly affecting Windows binary builds.
|
||||||
elif category is SourceCategory.WIN:
|
elif category is LazyBuildCategory.WIN:
|
||||||
paths = ['Makefile', 'src', 'resources/src', 'ballisticacore-windows']
|
|
||||||
|
def _win_dirfilter(root: str, dirname: str) -> bool:
|
||||||
|
if root == 'src' and dirname in {'meta', 'tools'}:
|
||||||
|
return False
|
||||||
|
if root == 'src/external' and dirname != 'windows':
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
Lazybuild(
|
||||||
|
target=target,
|
||||||
|
srcpaths=[
|
||||||
|
'Makefile',
|
||||||
|
'src',
|
||||||
|
'resources/src',
|
||||||
|
'ballisticacore-windows',
|
||||||
|
],
|
||||||
|
dirfilter=_win_dirfilter,
|
||||||
|
command=command,
|
||||||
|
).run()
|
||||||
|
|
||||||
# Everything possibly affecting resource builds.
|
# Everything possibly affecting resource builds.
|
||||||
elif category is SourceCategory.RESOURCES:
|
elif category is LazyBuildCategory.RESOURCES:
|
||||||
paths = [
|
Lazybuild(
|
||||||
'Makefile', 'tools/pcommand', 'resources/src', 'resources/Makefile'
|
target=target,
|
||||||
]
|
srcpaths=[
|
||||||
|
'Makefile',
|
||||||
|
'tools/pcommand',
|
||||||
|
'resources/src',
|
||||||
|
'resources/Makefile',
|
||||||
|
],
|
||||||
|
command=command,
|
||||||
|
).run()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'Invalid source category: {category}')
|
assert_never(category)
|
||||||
|
|
||||||
# Now do the thing if any our our input mod times changed.
|
|
||||||
if _lazybuild_check_paths(paths, category, target):
|
|
||||||
subprocess.run(command, shell=True, check=True)
|
|
||||||
|
|
||||||
# We also explicitly update the mod-time of the target;
|
|
||||||
# the command we (such as a VM build) may not have actually
|
|
||||||
# done anything but we still want to update our target to
|
|
||||||
# be newer than all the lazy sources.
|
|
||||||
os.makedirs(os.path.dirname(target), exist_ok=True)
|
|
||||||
Path(target).touch()
|
|
||||||
|
|
||||||
|
|
||||||
def archive_old_builds(ssh_server: str, builds_dir: str,
|
def archive_old_builds(ssh_server: str, builds_dir: str,
|
||||||
|
|||||||
@ -78,6 +78,11 @@ def generate(projroot: str) -> None:
|
|||||||
from batools.version import get_current_version
|
from batools.version import get_current_version
|
||||||
import pdoc
|
import pdoc
|
||||||
|
|
||||||
|
# Since we're operating on source dirs, suppress .pyc generation.
|
||||||
|
# (__pycache__ dirs in source dirs causes some subtle headaches in
|
||||||
|
# the private repo)
|
||||||
|
sys.dont_write_bytecode = True
|
||||||
|
|
||||||
# Make sure we're running from the dir above this script.
|
# Make sure we're running from the dir above this script.
|
||||||
os.chdir(projroot)
|
os.chdir(projroot)
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ from efro.terminal import Clr
|
|||||||
from efrotools import getconfig
|
from efrotools import getconfig
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional, Any
|
pass
|
||||||
|
|
||||||
# These paths need to be relative to the dir we're writing the Makefile to.
|
# These paths need to be relative to the dir we're writing the Makefile to.
|
||||||
TOOLS_DIR = '../../tools'
|
TOOLS_DIR = '../../tools'
|
||||||
@ -111,7 +111,7 @@ def _add_python_embedded_targets(targets: list[Target]) -> None:
|
|||||||
name = os.path.splitext(fname)[0]
|
name = os.path.splitext(fname)[0]
|
||||||
src = [
|
src = [
|
||||||
f'{pkg}/python_embedded/{name}.py',
|
f'{pkg}/python_embedded/{name}.py',
|
||||||
os.path.join(TOOLS_DIR, 'batools', 'meta.py')
|
# os.path.join(TOOLS_DIR, 'batools', 'meta.py')
|
||||||
]
|
]
|
||||||
dst = os.path.join(OUT_DIR_CPP, 'python_embedded', f'{name}.inc')
|
dst = os.path.join(OUT_DIR_CPP, 'python_embedded', f'{name}.inc')
|
||||||
if name == 'binding':
|
if name == 'binding':
|
||||||
@ -139,7 +139,7 @@ def _add_python_embedded_targets_internal(targets: list[Target]) -> None:
|
|||||||
Target(
|
Target(
|
||||||
src=[
|
src=[
|
||||||
f'{pkg}/python_embedded/{name}.py',
|
f'{pkg}/python_embedded/{name}.py',
|
||||||
os.path.join(TOOLS_DIR, 'batoolsinternal', 'meta.py')
|
# os.path.join(TOOLS_DIR, 'batoolsinternal', 'meta.py')
|
||||||
],
|
],
|
||||||
dst=os.path.join(OUT_DIR_CPP, 'python_embedded',
|
dst=os.path.join(OUT_DIR_CPP, 'python_embedded',
|
||||||
f'{name}.inc'),
|
f'{name}.inc'),
|
||||||
@ -161,7 +161,7 @@ def _add_extra_targets_internal(targets: list[Target]) -> None:
|
|||||||
Target(
|
Target(
|
||||||
src=[
|
src=[
|
||||||
f'bametainternal/python_embedded/{srcname}.py',
|
f'bametainternal/python_embedded/{srcname}.py',
|
||||||
os.path.join(TOOLS_DIR, 'batoolsinternal', 'meta.py')
|
# os.path.join(TOOLS_DIR, 'batoolsinternal', 'meta.py')
|
||||||
],
|
],
|
||||||
dst=f'bametainternal/generated/{dstname}.py',
|
dst=f'bametainternal/generated/{dstname}.py',
|
||||||
cmd=f'$(PCOMMAND) {gencmd} $@',
|
cmd=f'$(PCOMMAND) {gencmd} $@',
|
||||||
@ -175,7 +175,7 @@ def _add_extra_targets_internal(targets: list[Target]) -> None:
|
|||||||
Target(
|
Target(
|
||||||
src=[
|
src=[
|
||||||
f'bametainternal/generated/{name}.py',
|
f'bametainternal/generated/{name}.py',
|
||||||
os.path.join(TOOLS_DIR, 'batoolsinternal', 'meta.py')
|
# os.path.join(TOOLS_DIR, 'batoolsinternal', 'meta.py')
|
||||||
],
|
],
|
||||||
dst=os.path.join(OUT_DIR_CPP, 'python_embedded',
|
dst=os.path.join(OUT_DIR_CPP, 'python_embedded',
|
||||||
f'{name}.inc'),
|
f'{name}.inc'),
|
||||||
|
|||||||
@ -481,7 +481,10 @@ def warm_start_asset_build() -> None:
|
|||||||
|
|
||||||
def gendocs() -> None:
|
def gendocs() -> None:
|
||||||
"""Generate docs html."""
|
"""Generate docs html."""
|
||||||
|
from efro.terminal import Clr
|
||||||
import batools.docs
|
import batools.docs
|
||||||
|
|
||||||
|
print(f'{Clr.BLU}Generating docs html...{Clr.RST}')
|
||||||
batools.docs.generate(projroot=str(PROJROOT))
|
batools.docs.generate(projroot=str(PROJROOT))
|
||||||
|
|
||||||
|
|
||||||
@ -668,7 +671,7 @@ def lazybuild() -> None:
|
|||||||
if len(sys.argv) < 5:
|
if len(sys.argv) < 5:
|
||||||
raise CleanError('Expected at least 3 args')
|
raise CleanError('Expected at least 3 args')
|
||||||
try:
|
try:
|
||||||
category = batools.build.SourceCategory(sys.argv[2])
|
category = batools.build.LazyBuildCategory(sys.argv[2])
|
||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
raise CleanError(exc) from exc
|
raise CleanError(exc) from exc
|
||||||
target = sys.argv[3]
|
target = sys.argv[3]
|
||||||
|
|||||||
@ -15,7 +15,7 @@ from efro.terminal import Clr
|
|||||||
from efrotools import get_public_license
|
from efrotools import get_public_license
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional
|
pass
|
||||||
|
|
||||||
|
|
||||||
def camel_case_convert(name: str) -> str:
|
def camel_case_convert(name: str) -> str:
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import sys
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Sequence
|
pass
|
||||||
|
|
||||||
|
|
||||||
def _handle_args(args: list[str]) -> str:
|
def _handle_args(args: list[str]) -> str:
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import dataclasses
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Optional
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
def dataclass_diff(obj1: Any, obj2: Any) -> str:
|
def dataclass_diff(obj1: Any, obj2: Any) -> str:
|
||||||
|
|||||||
@ -75,7 +75,6 @@ def is_urllib_network_error(exc: BaseException) -> bool:
|
|||||||
ignored or presented to the user as general 'network-unavailable'
|
ignored or presented to the user as general 'network-unavailable'
|
||||||
states.
|
states.
|
||||||
"""
|
"""
|
||||||
import urllib.request
|
|
||||||
import urllib.error
|
import urllib.error
|
||||||
import http.client
|
import http.client
|
||||||
import errno
|
import errno
|
||||||
|
|||||||
@ -19,7 +19,7 @@ from efro.message._message import (Message, Response, ErrorResponse,
|
|||||||
UnregisteredMessageIDError)
|
UnregisteredMessageIDError)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Callable, Optional, Sequence, Union, Awaitable
|
from typing import Any, Optional, Literal
|
||||||
|
|
||||||
|
|
||||||
class MessageProtocol:
|
class MessageProtocol:
|
||||||
@ -228,7 +228,7 @@ class MessageProtocol:
|
|||||||
return out
|
return out
|
||||||
|
|
||||||
def _get_module_header(self,
|
def _get_module_header(self,
|
||||||
part: str,
|
part: Literal['sender', 'receiver'],
|
||||||
extra_import_code: Optional[str] = None) -> str:
|
extra_import_code: Optional[str] = None) -> str:
|
||||||
"""Return common parts of generated modules."""
|
"""Return common parts of generated modules."""
|
||||||
# pylint: disable=too-many-locals, too-many-branches
|
# pylint: disable=too-many-locals, too-many-branches
|
||||||
@ -238,11 +238,16 @@ class MessageProtocol:
|
|||||||
|
|
||||||
single_message_type = len(self.message_ids_by_type) == 1
|
single_message_type = len(self.message_ids_by_type) == 1
|
||||||
|
|
||||||
# Always import messages
|
msgtypes = list(self.message_ids_by_type)
|
||||||
for msgtype in list(self.message_ids_by_type) + [Message]:
|
if part == 'sender':
|
||||||
|
msgtypes.append(Message)
|
||||||
|
for msgtype in msgtypes:
|
||||||
tpimports.setdefault(msgtype.__module__,
|
tpimports.setdefault(msgtype.__module__,
|
||||||
[]).append(msgtype.__name__)
|
[]).append(msgtype.__name__)
|
||||||
for rsp_tp in list(self.response_ids_by_type) + [Response]:
|
rsptypes = list(self.response_ids_by_type)
|
||||||
|
if part == 'sender':
|
||||||
|
rsptypes.append(Response)
|
||||||
|
for rsp_tp in rsptypes:
|
||||||
# Skip these as they don't actually show up in code.
|
# Skip these as they don't actually show up in code.
|
||||||
if rsp_tp is EmptyResponse or rsp_tp is ErrorResponse:
|
if rsp_tp is EmptyResponse or rsp_tp is ErrorResponse:
|
||||||
continue
|
continue
|
||||||
@ -292,6 +297,14 @@ class MessageProtocol:
|
|||||||
|
|
||||||
ovld = ', overload' if not single_message_type else ''
|
ovld = ', overload' if not single_message_type else ''
|
||||||
tpimport_lines = textwrap.indent(tpimport_lines, ' ')
|
tpimport_lines = textwrap.indent(tpimport_lines, ' ')
|
||||||
|
|
||||||
|
# We need Optional for sender-modules with multiple types
|
||||||
|
baseimps = ['Union', 'Any']
|
||||||
|
if part == 'sender' and len(msgtypes) > 1:
|
||||||
|
baseimps.append('Optional')
|
||||||
|
if part == 'receiver':
|
||||||
|
baseimps.append('Callable')
|
||||||
|
baseimps_s = ', '.join(baseimps)
|
||||||
out = ('# Released under the MIT License. See LICENSE for details.\n'
|
out = ('# Released under the MIT License. See LICENSE for details.\n'
|
||||||
f'#\n'
|
f'#\n'
|
||||||
f'"""Auto-generated {part} module. Do not edit by hand."""\n'
|
f'"""Auto-generated {part} module. Do not edit by hand."""\n'
|
||||||
@ -303,7 +316,7 @@ class MessageProtocol:
|
|||||||
f'{import_lines}\n'
|
f'{import_lines}\n'
|
||||||
f'\n'
|
f'\n'
|
||||||
f'if TYPE_CHECKING:\n'
|
f'if TYPE_CHECKING:\n'
|
||||||
f' from typing import Union, Any, Optional, Callable'
|
f' from typing import {baseimps_s}'
|
||||||
f'{tpimport_typing_extras}\n'
|
f'{tpimport_typing_extras}\n'
|
||||||
f'{tpimport_lines}'
|
f'{tpimport_lines}'
|
||||||
f'\n'
|
f'\n'
|
||||||
|
|||||||
@ -14,7 +14,7 @@ from efro.message._message import (Message, Response, EmptyResponse,
|
|||||||
ErrorResponse, UnregisteredMessageIDError)
|
ErrorResponse, UnregisteredMessageIDError)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Any, Callable, Optional, Awaitable, Union
|
from typing import Any, Callable, Optional, Union
|
||||||
|
|
||||||
from efro.message._protocol import MessageProtocol
|
from efro.message._protocol import MessageProtocol
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,6 @@ from efro.dataclassio import (dataclass_to_json, dataclass_from_json,
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Literal, Awaitable, Callable, Optional
|
from typing import Literal, Awaitable, Callable, Optional
|
||||||
from threading import Thread
|
|
||||||
|
|
||||||
# Terminology:
|
# Terminology:
|
||||||
# Packet: A chunk of data consisting of a type and some type-dependent
|
# Packet: A chunk of data consisting of a type and some type-dependent
|
||||||
|
|||||||
185
tools/efrotools/build.py
Normal file
185
tools/efrotools/build.py
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
# Released under the MIT License. See LICENSE for details.
|
||||||
|
#
|
||||||
|
"""Functionality used for building."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from efro.terminal import Clr
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from typing import Optional, Callable
|
||||||
|
|
||||||
|
|
||||||
|
class Lazybuild:
|
||||||
|
"""Run a build if anything in some category is newer than a target.
|
||||||
|
|
||||||
|
This can be used as an optimization for build targets that *always* run.
|
||||||
|
As an example, a target that spins up a VM and runs a build can be
|
||||||
|
expensive even if the VM build process determines that nothing has changed
|
||||||
|
and does no work. We can use this to examine a broad swath of source files
|
||||||
|
and skip firing up the VM if nothing has changed. We can be overly broad
|
||||||
|
in the sources we look at since the worst result of a false positive change
|
||||||
|
is the VM spinning up and determining that no actual inputs have changed.
|
||||||
|
We could recreate this mechanism purely in the Makefile, but large numbers
|
||||||
|
of target sources can add significant overhead each time the Makefile is
|
||||||
|
invoked; in our case the cost is only incurred when a build is triggered.
|
||||||
|
|
||||||
|
Note that target's mod-time will *always* be updated to match the newest
|
||||||
|
source regardless of whether the build itself was triggered.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
target: str,
|
||||||
|
srcpaths: list[str],
|
||||||
|
command: str,
|
||||||
|
dirfilter: Optional[Callable[[str, str], bool]] = None,
|
||||||
|
filefilter: Optional[Callable[[str, str], bool]] = None,
|
||||||
|
srcpaths_fullclean: Optional[list[str]] = None,
|
||||||
|
command_fullclean: Optional[str] = None) -> None:
|
||||||
|
self.target = target
|
||||||
|
self.srcpaths = srcpaths
|
||||||
|
self.command = command
|
||||||
|
self.dirfilter = dirfilter
|
||||||
|
self.filefilter = filefilter
|
||||||
|
self.mtime = None if not os.path.exists(
|
||||||
|
self.target) else os.path.getmtime(self.target)
|
||||||
|
|
||||||
|
# Show prettier names for lazybuild cache dir targets.
|
||||||
|
if target.startswith('.cache/lazybuild/'):
|
||||||
|
self.target_name_pretty = target[len('.cache/lazybuild/'):]
|
||||||
|
else:
|
||||||
|
self.target_name_pretty = target
|
||||||
|
|
||||||
|
self.have_fullclean_changes = False
|
||||||
|
self.have_changes = False
|
||||||
|
self.total_unchanged_count = 0
|
||||||
|
|
||||||
|
# We support a mechanism where some paths can be passed as 'fullclean'
|
||||||
|
# paths - these will trigger a separate 'fullclean' command as well as
|
||||||
|
# the regular command when any of them change. This is handy for 'meta'
|
||||||
|
# type builds where a lot of tools scripts can conceivably influence
|
||||||
|
# target creation, but where it would be unwieldy to list all of them
|
||||||
|
# as sources in a Makefile.
|
||||||
|
self.srcpaths_fullclean = srcpaths_fullclean
|
||||||
|
self.command_fullclean = command_fullclean
|
||||||
|
if ((self.srcpaths_fullclean is None) !=
|
||||||
|
(self.command_fullclean is None)):
|
||||||
|
raise RuntimeError('Must provide both srcpaths_fullclean and'
|
||||||
|
' command_fullclean together')
|
||||||
|
|
||||||
|
def run(self) -> None:
|
||||||
|
"""Do the thing."""
|
||||||
|
|
||||||
|
self._check_paths()
|
||||||
|
|
||||||
|
if self.have_fullclean_changes:
|
||||||
|
assert self.command_fullclean is not None
|
||||||
|
print(f'{Clr.BLU}Lazybuild: \'fullclean\' input changed;'
|
||||||
|
f' running {Clr.BLD}{self.command_fullclean}.{Clr.RST}')
|
||||||
|
subprocess.run(self.command_fullclean, shell=True, check=True)
|
||||||
|
|
||||||
|
if self.have_changes:
|
||||||
|
subprocess.run(self.command, shell=True, check=True)
|
||||||
|
|
||||||
|
# We also explicitly update the mod-time of the target;
|
||||||
|
# the command we (such as a VM build) may not have actually
|
||||||
|
# done anything but we still want to update our target to
|
||||||
|
# be newer than all the lazy sources.
|
||||||
|
os.makedirs(os.path.dirname(self.target), exist_ok=True)
|
||||||
|
Path(self.target).touch()
|
||||||
|
else:
|
||||||
|
print(
|
||||||
|
f'{Clr.BLU}Lazybuild: skipping "{self.target_name_pretty}"'
|
||||||
|
f' ({self.total_unchanged_count} inputs unchanged).{Clr.RST}')
|
||||||
|
|
||||||
|
def _check_paths(self) -> None:
|
||||||
|
|
||||||
|
# First check our fullclean paths if we have them.
|
||||||
|
# any changes here will kick off a full-clean and then a build.
|
||||||
|
if self.srcpaths_fullclean is not None:
|
||||||
|
for srcpath in self.srcpaths_fullclean:
|
||||||
|
src_did_change, src_unchanged_count = self._check_path(srcpath)
|
||||||
|
if src_did_change:
|
||||||
|
self.have_fullclean_changes = True
|
||||||
|
self.have_changes = True
|
||||||
|
return # Can stop as soon as we find a change.
|
||||||
|
self.total_unchanged_count += src_unchanged_count
|
||||||
|
|
||||||
|
# Ok; no fullclean changes found. Now check our regular paths.
|
||||||
|
# Any changes here just trigger a regular build.
|
||||||
|
for srcpath in self.srcpaths:
|
||||||
|
src_did_change, src_unchanged_count = self._check_path(srcpath)
|
||||||
|
if src_did_change:
|
||||||
|
self.have_changes = True
|
||||||
|
return # Can stop as soon as we find a change.
|
||||||
|
self.total_unchanged_count += src_unchanged_count
|
||||||
|
|
||||||
|
def _check_path(self, srcpath: str) -> tuple[bool, int]:
|
||||||
|
"""Return whether path has changed and unchanged file count if not."""
|
||||||
|
unchanged_count = 0
|
||||||
|
|
||||||
|
# Add files verbatim; recurse through dirs.
|
||||||
|
if os.path.isfile(srcpath):
|
||||||
|
if self._test_path(srcpath):
|
||||||
|
return True, 0
|
||||||
|
unchanged_count += 1
|
||||||
|
return False, unchanged_count
|
||||||
|
for root, dirnames, fnames in os.walk(srcpath, topdown=True):
|
||||||
|
# In top-down mode we can modify dirnames in-place to
|
||||||
|
# prevent recursing into them at all.
|
||||||
|
for dirname in list(dirnames): # (make a copy)
|
||||||
|
if (not self._default_dir_filter(root, dirname)
|
||||||
|
or (self.dirfilter is not None
|
||||||
|
and not self.dirfilter(root, dirname))):
|
||||||
|
dirnames.remove(dirname)
|
||||||
|
|
||||||
|
for fname in fnames:
|
||||||
|
if (not self._default_file_filter(root, fname)
|
||||||
|
or (self.filefilter is not None
|
||||||
|
and not self.filefilter(root, fname))):
|
||||||
|
continue
|
||||||
|
fpath = os.path.join(root, fname)
|
||||||
|
|
||||||
|
# For now don't wanna worry about supporting spaces.
|
||||||
|
if ' ' in fpath:
|
||||||
|
raise RuntimeError(f'Invalid path with space: {fpath}')
|
||||||
|
|
||||||
|
if self._test_path(fpath):
|
||||||
|
return True, 0
|
||||||
|
unchanged_count += 1
|
||||||
|
return False, unchanged_count
|
||||||
|
|
||||||
|
def _default_dir_filter(self, root: str, dirname: str) -> bool:
|
||||||
|
del root # Unused.
|
||||||
|
|
||||||
|
# Ignore hidden dirs.
|
||||||
|
if dirname.startswith('.'):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Ignore Python caches.
|
||||||
|
if dirname == '__pycache__':
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _default_file_filter(self, root: str, fname: str) -> bool:
|
||||||
|
del root # Unused.
|
||||||
|
|
||||||
|
# Ignore hidden files.
|
||||||
|
if fname.startswith('.'):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _test_path(self, path: str) -> bool:
|
||||||
|
# Now see this path is newer than our target..
|
||||||
|
if self.mtime is None or os.path.getmtime(path) >= self.mtime:
|
||||||
|
print(f'{Clr.SMAG}Build of {self.target_name_pretty} triggered'
|
||||||
|
f' by change in \'{path}\'{Clr.RST}')
|
||||||
|
return True
|
||||||
|
return False
|
||||||
@ -34,6 +34,7 @@ class _FileBatchesRun:
|
|||||||
if self._include_mac_packages:
|
if self._include_mac_packages:
|
||||||
# pylint: disable=useless-suppression
|
# pylint: disable=useless-suppression
|
||||||
# pylint: disable=no-name-in-module, import-error
|
# pylint: disable=no-name-in-module, import-error
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
from Cocoa import NSWorkspace
|
from Cocoa import NSWorkspace
|
||||||
self._shared_nsworkspace = NSWorkspace.sharedWorkspace()
|
self._shared_nsworkspace = NSWorkspace.sharedWorkspace()
|
||||||
# pylint: enable=useless-suppression
|
# pylint: enable=useless-suppression
|
||||||
|
|||||||
@ -13,8 +13,6 @@ from efrotools.code import format_yapf_str
|
|||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from efro.message import MessageProtocol
|
|
||||||
|
|
||||||
|
|
||||||
def standard_message_sender_gen_pcommand(
|
def standard_message_sender_gen_pcommand(
|
||||||
projroot: Path,
|
projroot: Path,
|
||||||
|
|||||||
@ -131,6 +131,7 @@ class StaticTestFile:
|
|||||||
f'{self._filename} line {lineno+1}: expected '
|
f'{self._filename} line {lineno+1}: expected '
|
||||||
f' a single assert statement.')
|
f' a single assert statement.')
|
||||||
assertnode = tree.body[0]
|
assertnode = tree.body[0]
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
callnode = assertnode.test
|
callnode = assertnode.test
|
||||||
if (not isinstance(callnode, ast.Call)
|
if (not isinstance(callnode, ast.Call)
|
||||||
or not isinstance(callnode.func, ast.Name)
|
or not isinstance(callnode.func, ast.Name)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user