Merge branch 'efroemling:master' into master

This commit is contained in:
Vishal 2024-06-21 01:11:21 +05:30 committed by GitHub
commit 1a1003a8c6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 925 additions and 279 deletions

128
.efrocachemap generated
View File

@ -421,7 +421,7 @@
"build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26",
"build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8",
"build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55",
"build/assets/ba_data/data/langdata.json": "7e73466677344c1722aebe94003360d5",
"build/assets/ba_data/data/langdata.json": "b83c9445922f68152c5d0efa1f0fe608",
"build/assets/ba_data/data/languages/arabic.json": "05040616cb7585e3cce2e9acba96aa75",
"build/assets/ba_data/data/languages/belarussian.json": "3d5523d0004293aa2df02f3f6f3b84f8",
"build/assets/ba_data/data/languages/chinese.json": "2f67c6b127ae85492ac552af1a91e95a",
@ -432,21 +432,21 @@
"build/assets/ba_data/data/languages/dutch.json": "b0900d572c9141897d53d6574c471343",
"build/assets/ba_data/data/languages/english.json": "9754e816d3bc3214b7e809950d642309",
"build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880",
"build/assets/ba_data/data/languages/filipino.json": "9c04219ceeb065b3bc751e6ab3731def",
"build/assets/ba_data/data/languages/french.json": "ee2a81129519d7030a617308da8c9195",
"build/assets/ba_data/data/languages/filipino.json": "aa8c94a49dec96d050be2329c3b6dcba",
"build/assets/ba_data/data/languages/french.json": "b7d11199756f0eb4f1a745ceee652b2a",
"build/assets/ba_data/data/languages/german.json": "198b9860c5b9df7b8e3e30b03d8755cb",
"build/assets/ba_data/data/languages/gibberish.json": "3e68d809bd6ede3b9e2c57c147737e42",
"build/assets/ba_data/data/languages/greek.json": "ad3c0d38f34d809824892d6f22808dbf",
"build/assets/ba_data/data/languages/hindi.json": "bb3548531daf7bc7fee4a28d48228c32",
"build/assets/ba_data/data/languages/hungarian.json": "6b08fea24b72cc805ed0dc59e11c4cd6",
"build/assets/ba_data/data/languages/indonesian.json": "9103845242b572aa8ba48e24f81ddb68",
"build/assets/ba_data/data/languages/indonesian.json": "ed9038bf4b9216f93eb73e753e162706",
"build/assets/ba_data/data/languages/italian.json": "e1d69eb1eec31442bf981121c7cfaf17",
"build/assets/ba_data/data/languages/korean.json": "4e3524327a0174250aff5e1ef4c0c597",
"build/assets/ba_data/data/languages/malay.json": "f6ce0426d03a62612e3e436ed5d1be1f",
"build/assets/ba_data/data/languages/persian.json": "c209f8f6d3b3dd40d5ca9d36fe0721fe",
"build/assets/ba_data/data/languages/polish.json": "59ff98adfb4f515f00769d1ec229c232",
"build/assets/ba_data/data/languages/portuguese.json": "615a59bd03f84659158d9f2608a4ab21",
"build/assets/ba_data/data/languages/romanian.json": "b3e46efd6f869dbd78014570e037c290",
"build/assets/ba_data/data/languages/romanian.json": "ef68520f749cf3641d4e4225a6166349",
"build/assets/ba_data/data/languages/russian.json": "41e06eda170fb5960393dd6b58d046e1",
"build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69",
"build/assets/ba_data/data/languages/slovak.json": "3c08c748c96c71bd9e1d7291fb8817b6",
@ -455,7 +455,7 @@
"build/assets/ba_data/data/languages/tamil.json": "b9fcc523639f55e05c7f4e7914f3321a",
"build/assets/ba_data/data/languages/thai.json": "1d665629361f302693dead39de8fa945",
"build/assets/ba_data/data/languages/turkish.json": "fe4c7354ca6e657c2645969325af574a",
"build/assets/ba_data/data/languages/ukrainian.json": "76ad64cb4911c8d5a3e4815b865ce5bd",
"build/assets/ba_data/data/languages/ukrainian.json": "3f9ee9567a068b760bbf25433177db89",
"build/assets/ba_data/data/languages/venetian.json": "96e7607b0aa79b7eb48cac8df77e8e65",
"build/assets/ba_data/data/languages/vietnamese.json": "b175cd0f01d0433355f144aeaa333409",
"build/assets/ba_data/data/maps/big_g.json": "1dd301d490643088a435ce75df971054",
@ -945,11 +945,11 @@
"build/assets/ba_data/meshes/zoeTorso.bob": "26a1007e98902178d8c62fd7069d5da5",
"build/assets/ba_data/meshes/zoeUpperArm.bob": "a8a881010ac1ee9ec5ca872d5c5e853a",
"build/assets/ba_data/meshes/zoeUpperLeg.bob": "95b2502f74c70f934927f67cd505c3ad",
"build/assets/ba_data/python-site-packages/certifi/__init__.py": "98360d9e66de68a618eed6098a65405b",
"build/assets/ba_data/python-site-packages/certifi/__init__.py": "c935c5aee4052f1c76954ace35723dfe",
"build/assets/ba_data/python-site-packages/certifi/__main__.py": "ef02e73f8581609df189a9f61aca365b",
"build/assets/ba_data/python-site-packages/certifi/cacert.pem": "4e587dca9ab75057ffef6658ed385ff2",
"build/assets/ba_data/python-site-packages/certifi/cacert.pem": "47f35c87a8abc6ace093db7c215f1eab",
"build/assets/ba_data/python-site-packages/certifi/core.py": "c1b8c102093ea26587619677c7ec6016",
"build/assets/ba_data/python-site-packages/typing_extensions.py": "f1af94a03caf6fc79be0aedc8ab03090",
"build/assets/ba_data/python-site-packages/typing_extensions.py": "1f6b4db70adb7ca05dff2b74f6cde8aa",
"build/assets/ba_data/textures/achievementBoxer.dds": "5b5c461e67f3a92105b56fe264a7dd28",
"build/assets/ba_data/textures/achievementBoxer.ktx": "1055e009423ea1d0bc3b172f9d7328bb",
"build/assets/ba_data/textures/achievementBoxer.pvr": "48f212189a6d83d29be410613b4f0005",
@ -3038,16 +3038,16 @@
"build/assets/pylib-apple/_pylong.py": "e057ab3c9eea264704dff2af204884f8",
"build/assets/pylib-apple/_sitebuiltins.py": "8b5e3f6e73917962fa014ad2c4a55e61",
"build/assets/pylib-apple/_strptime.py": "ed6521fd413f31f0de7be162af8db9f5",
"build/assets/pylib-apple/_sysconfigdata__darwin_darwin.py": "bc494dcb0239846f92c26622e84fb99d",
"build/assets/pylib-apple/_sysconfigdata__ios_iphoneos-arm64.py": "f073b8cdfe4179236abb923d538e7fbe",
"build/assets/pylib-apple/_sysconfigdata__ios_iphonesimulator-arm64.py": "2c3a1b46d9966d740b226d0d603a392a",
"build/assets/pylib-apple/_sysconfigdata__tvos_appletvos-arm64.py": "df1d00e8a7b529d64e600c8113d872d7",
"build/assets/pylib-apple/_sysconfigdata__tvos_appletvsimulator-arm64.py": "f9b8d515e7a6619fea32ab77c341b294",
"build/assets/pylib-apple/_sysconfigdata_d_darwin_darwin.py": "bd1f109ca34c52afd95632f7ae64171f",
"build/assets/pylib-apple/_sysconfigdata_d_ios_iphoneos-arm64.py": "178d3dc412e56aeaa211c8f5237f9462",
"build/assets/pylib-apple/_sysconfigdata_d_ios_iphonesimulator-arm64.py": "fc568dd0c36d2253993b9a48f53535d6",
"build/assets/pylib-apple/_sysconfigdata_d_tvos_appletvos-arm64.py": "50e50f852dc4f6acd785fa83c2e6530b",
"build/assets/pylib-apple/_sysconfigdata_d_tvos_appletvsimulator-arm64.py": "5e2dd0675c1364fb20fb7777c4c0eeb0",
"build/assets/pylib-apple/_sysconfigdata__darwin_darwin.py": "0cf2ec75dca64a6fd736fbf0d7cf21d7",
"build/assets/pylib-apple/_sysconfigdata__ios_iphoneos-arm64.py": "00f4ef0ea2ae8fa7994813bca8972016",
"build/assets/pylib-apple/_sysconfigdata__ios_iphonesimulator-arm64.py": "4a3f247c7dfc903e89fda0bd20ef48fb",
"build/assets/pylib-apple/_sysconfigdata__tvos_appletvos-arm64.py": "6a817c7dcc35197e965ef4d1be6a5c94",
"build/assets/pylib-apple/_sysconfigdata__tvos_appletvsimulator-arm64.py": "d3adfa519698ddd824b4ef721c3460b7",
"build/assets/pylib-apple/_sysconfigdata_d_darwin_darwin.py": "776b50a7ff9d04c04a73df196b556848",
"build/assets/pylib-apple/_sysconfigdata_d_ios_iphoneos-arm64.py": "6700b08928d64c1c1eac4412c377e86e",
"build/assets/pylib-apple/_sysconfigdata_d_ios_iphonesimulator-arm64.py": "4fd4334d6c43fe9f65ae83905c6b8a33",
"build/assets/pylib-apple/_sysconfigdata_d_tvos_appletvos-arm64.py": "ad79fe9e0594bbc43adf53c96a4a81dc",
"build/assets/pylib-apple/_sysconfigdata_d_tvos_appletvsimulator-arm64.py": "18829d0bbee15874cd46cbe8d85e36e8",
"build/assets/pylib-apple/_threading_local.py": "4a9688e3987d7d692db46feb9214945e",
"build/assets/pylib-apple/_weakrefset.py": "e4fa8532ace46dfbc35149c41ea497f7",
"build/assets/pylib-apple/abc.py": "a0daa1ed187eee8690c1e8438b97da90",
@ -3445,7 +3445,7 @@
"build/assets/pylib-apple/typing.py": "a5996aa02b21708d88c67946dabd529e",
"build/assets/pylib-apple/urllib/__init__.py": "340c83beff7dcff8f5c7b87cd43cedaf",
"build/assets/pylib-apple/urllib/error.py": "b7dde0483ff647eb87162d6e19c04fa0",
"build/assets/pylib-apple/urllib/parse.py": "112c518e8857be22f75ef4cd668fe5b4",
"build/assets/pylib-apple/urllib/parse.py": "8fa7882c3e97acfde85cb4486a0ceedf",
"build/assets/pylib-apple/urllib/request.py": "2a9f2ec22765c9959240f559bcb2fca3",
"build/assets/pylib-apple/urllib/response.py": "c8537707a4b1e493c0ec4489ab523c93",
"build/assets/pylib-apple/urllib/robotparser.py": "5a7616bdf398c166f953ad48c25506eb",
@ -4038,50 +4038,50 @@
"build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1",
"build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae",
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "bfd2a477d0322f6fb74656f9a0dedae0",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "0d2f166f927785c9abbd7911b1940f4b",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b0fb1c006ebf24c74084e94308f4dd0a",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "a5d29314d5853e1a904f4b3ae48d6f21",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "d7182ecdcb53449fe67d54af9c088888",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "7bb195668fa054394d03abf4b3ed2952",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "22e16d10a41b36c5db277ec717488596",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "baa648fe7e976df9155b5e0994d334b6",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "8c9b4d2626ce4674efa4a37d8cff6857",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "121545e12decb46689681cda8721f708",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "c72adfcd1ccc8bfc412e62efa98a8e14",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "90ad3bc819d90bcfeb5563692a9606db",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "3ef248a8d70eaaedc6783898651bb668",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "2cdfa98b7b372ee3d19446cf95ebb8ef",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "715854042fe4f2470d67593bbad571d1",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "675ec134554280a37aaa2951adf48dac",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "c5b6443b911d21f020a8ff9c7bf23e98",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "3ce98ab785f8c7656f3d7b2ee4491975",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "80c142f30aa63759bbe4d017f83d5977",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "029360ae2dba2279d41022647afd0c52",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "9162b53189b80d4e5938cd142acd2a1a",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "2226d0e2d34051d962320c86464f3a2d",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "9162b53189b80d4e5938cd142acd2a1a",
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "2226d0e2d34051d962320c86464f3a2d",
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "c2d287b53bdac7e5302fe833ac052d2c",
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "b3942d4e7c940d86fc039ae149756d3f",
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "c2d287b53bdac7e5302fe833ac052d2c",
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "b3942d4e7c940d86fc039ae149756d3f",
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "6c3d9a42b9cdc7af45f7273f76010dd5",
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "404e2e994a58d2e930f189ab835ada45",
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "6c3d9a42b9cdc7af45f7273f76010dd5",
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "404e2e994a58d2e930f189ab835ada45",
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "848cfd50cf15726e3acefd60204a85c5",
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "299b6c4b83966040618b27563b700c2a",
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "08c2f91d086e6f3fa73ebc299112358a",
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "299b6c4b83966040618b27563b700c2a",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "ec11bac6a42f25e02cd218928625c9b7",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "4dc943a3a551a0615fe33c56ac8b5bd7",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "457df093184e56955a1170340e57cf43",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "108e96eeda885404682b0762552e0f61",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "11691eb6e947ee36f315c979a305533a",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "bdfa516a57bd798e482d20ebd074488c",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "f25bf000209c0d97a852c71afa186c3a",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "d2aae5f895446cd23f2c5bb0656c79a3",
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "1f69ddeb02931a14350dca8c9f57d7f1",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "4ef2017d98434d78fc6d16121220241e",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "9c131cc99b84ead5c6c4ca62167cff9b",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "d24cf6110773ef8b4814d666e8c0c435",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "831b1526ece045decbf1e0de5af24052",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "e20c0e2216583337f0f1b6529d0ba11f",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "75a8601f7e9f82af46d93ffc8a256a7b",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "b6dd5a6381c76da06d4e3f28b9ae26d7",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "3de8379bc9d925752559f395c85c1ebc",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "68a9183674846903f4dec83d94023498",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "f0a26bbd08a4ddd9fe331bba6f731dd0",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "f346ea68ff1614e64b5555c5fed60618",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "7ae36210f6167ae2cd88905c93800330",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "e1e54514c6322544a41f53c84e441967",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "60f081b960424b9a3dddc33824a5d866",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "6712b886792057c5cac6bfcbbf93fa6f",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "5bce4fd4303d03d5a4d3cba16aaf7dcb",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "3f72837a59d31d11e08edb0f395642d2",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "7400ee0e8a3c925af6e4859599fed64c",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "5b1db66f277c057d503aae53991adfc5",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "c471e06d03862e91a2a949806803efbd",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "4f7b8eed54eb4c7d2b6400aaa4dfa37c",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "c471e06d03862e91a2a949806803efbd",
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "4f7b8eed54eb4c7d2b6400aaa4dfa37c",
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "ec5f39fe33f753cace45ecda7b78e376",
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "5ca18c2abecb1b369ddd7ff43880baa0",
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "ec5f39fe33f753cace45ecda7b78e376",
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "5ca18c2abecb1b369ddd7ff43880baa0",
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "789b8d5e80d66c74af1ff0b978301704",
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "4fa185d99e799027b324704de3925aca",
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "789b8d5e80d66c74af1ff0b978301704",
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "4fa185d99e799027b324704de3925aca",
"build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "3b9db190dc436e7bfd4521b94d9b5974",
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "cd5c91eecddb1da4e8204e3496466a07",
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "9adc2dc1c5c3cdc1ca6fc98fc76644c5",
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "cd5c91eecddb1da4e8204e3496466a07",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "dc57789d3ee490d8354b259da3d126e5",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "f6c205dec651096d4b79c33fbc6521d3",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "57eaa29add181299dfeca00638cec027",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "45a0e7f47f87ac16eea7ed3c8344e930",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "3e73473e692c1076ba35230db92718df",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "b4a041b108895d140d7bae117bb6d899",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "6140fbb0c041b1a7b8fa18bca1b61b42",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "6b6b016b72558a9138fccf7f5462f1de",
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
"src/assets/ba_data/python/babase/_mgen/enums.py": "5548f407d97e380069f6c596c4e36cd7",
"src/ballistica/base/mgen/pyembed/binding_base.inc": "efa61468cf098f77cc6a234461d8b86d",

View File

@ -185,39 +185,3 @@ jobs:
with:
name: windows_x86_server_(debug)
path: build/prefab/full/windows_x86_server
make_sphinx_docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make docs-sphinx
- name: Upload the build
uses: actions/upload-artifact@v4
with:
name: sphinx_html_docs
path: build/sphinx
make_docker_image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make docker-save
- name: Upload the build
uses: actions/upload-artifact@v4
with:
name: docker_server(release)
path: build/docker/bombsquad_server_docker.tar

64
.github/workflows/nightly.yml vendored Normal file
View File

@ -0,0 +1,64 @@
name: Nightly Build
on:
# Run everyday at 5:30 UTC
schedule:
- cron: '30 5 * * *'
jobs:
make_docker_gui_debug_image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: |
make docker-gui-debug
make docker-save
- name: Upload the build
uses: actions/upload-artifact@v4
with:
name: docker_gui(debug)
path: build/docker/bombsquad_gui_debug_docker.tar
make_docker_server_debug_image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: |
make docker-server-debug
make docker-save
- name: Upload the build
uses: actions/upload-artifact@v4
with:
name: docker_server(debug)
path: build/docker/bombsquad_server_debug_docker.tar
make_sphinx_docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make docs-sphinx
- name: Upload the build
uses: actions/upload-artifact@v4
with:
name: sphinx_html_docs
path: build/sphinx

273
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,273 @@
name: Release
on:
push:
tags:
- 'v*'
jobs:
release_linux_x86_64_gui_debug_build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-gui-debug-build
- name: Compress the build
run: tar -cf "linux_x86_64_gui_debug.tar" build/prefab/full/linux_x86_64_gui/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: linux_x86_64_gui_debug.tar
release_linux_x86_64_server_debug_build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-server-debug-build
- name: Compress the build
run: tar -cf "linux_x86_64_server_debug.tar" build/prefab/full/linux_x86_64_server/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: linux_x86_64_server_debug.tar
release_linux_arm64_gui_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-linux-arm64-gui-debug-build
- name: Compress the build
run: tar -cf "linux_arm64_gui_debug.tar" build/prefab/full/linux_arm64_gui/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: linux_arm64_gui_debug.tar
release_linux_arm64_server_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-linux-arm64-server-debug-build
- name: Compress the build
run: tar -cf "linux_arm64_server_debug.tar" build/prefab/full/linux_arm64_server/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: linux_arm64_server_debug.tar
release_mac_x86_64_gui_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-mac-x86-64-gui-debug-build
- name: Compress the build
run: tar -cf "mac_x86_64_gui_debug.tar" build/prefab/full/mac_x86_64_gui/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: mac_x86_64_gui_debug.tar
release_mac_x86_64_server_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-mac-x86-64-server-debug-build
- name: Compress the build
run: tar -cf "mac_x86_64_server_debug.tar" build/prefab/full/mac_x86_64_server/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: mac_x86_64_server_debug.tar
release_mac_arm64_gui_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-mac-arm64-gui-debug-build
- name: Compress the build
run: tar -cf "mac_arm64_gui_debug.tar" build/prefab/full/mac_arm64_gui/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: mac_arm64_gui_debug.tar
release_mac_arm64_server_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-mac-arm64-server-debug-build
- name: Compress the build
run: tar -cf "mac_arm64_server_debug.tar" build/prefab/full/mac_arm64_server/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: mac_arm64_server_debug.tar
release_windows_x86_gui_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-windows-x86-gui-debug-build
- name: Compress the build
run: tar -cf "windows_x86_gui_debug.tar" build/prefab/full/windows_x86_gui/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: windows_x86_gui_debug.tar
release_windows_x86_server_debug_build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make prefab-windows-x86-server-debug-build
- name: Compress the build
run: tar -cf "windows_x86_server_debug.tar" build/prefab/full/windows_x86_server/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: windows_x86_server_debug.tar
release_docker_gui_image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: |
make docker-gui-release
make docker-save
- name: Rename the build
run: mv build/docker/bombsquad_gui_release_docker.tar build/docker/bombsquad_docker_gui.tar
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: build/docker/bombsquad_docker_gui.tar
release_docker_server_image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: |
make docker-server-release
make docker-save
- name: Rename the build
run: mv build/docker/bombsquad_server_release_docker.tar build/docker/bombsquad_docker_server.tar
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: build/docker/bombsquad_docker_server.tar
release_sphinx_docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Setup project environment
run: make env
- name: Make the build
run: make docs-sphinx
- name: Compress the build
run: tar -cf "sphinx_html_docs.tar" build/sphinx/
- name: Upload the build
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: sphinx_html_docs.tar

View File

@ -1,4 +1,4 @@
### 1.7.35 (build 21882, api 8, 2024-05-29)
### 1.7.35 (build 21888, api 8, 2024-06-16)
- Fixed an issue where the engine would block at exit on some version of Linux
until Ctrl-D was pressed in the calling terminal.
- V2 accounts have been around for a while now, so the old V1 device login
@ -47,20 +47,7 @@
two forms. Now it is possible to provide both.
- Spaz classes now have a `default_hitpoints` which makes customizing that
easier (Thanks rabbitboom!)
- (WORK IN PROGRESS) As of this version, servers are *required* to be accessible
via ipv4 to appear in the public listing. So they may need to provide an ipv4
address in their config if the automatically detected one is ipv6. This should
reduce the confusion of ipv6-only servers appearing greyed out for lots of
ipv4-only people. Pretty much everyone can connect to ipv4.
- (WORK IN PROGRESS) There is now more personalized error feedback for the
connectivity checks when poking `Make My Party Public` or when launching the
command line server. Hopefully this will help navigate the new dual ipv4/ipv6
situation.
- (WORK IN PROGRESS) The low level `ConnectionToHostUDP` class can now accept
multiple `SockAddr`s; it will attempt to contact the host on all of them and
use whichever responds first. This allows us to pass both ipv4 and ipv6
addresses when available and transparently use whichever is more performant.
- Added `docker-build`, `docker-run`, `docker-clean` and `docker-save` targets
- Added `docker-gui-release`, `docker-gui-debug`, `docker-server-release`, `docker-server-debug`, `docker-clean` and `docker-save` targets
to Makefile.
- Fixed an issue in Assault where being teleported back to base with a sticky
bomb stuck to you would do some crazy rubber-band-launching thing (Thanks
@ -82,6 +69,8 @@
efrocache when anything in the cache-map changed (which is the case for most
commits). Please holler if you are still seeing lots more 'Extracting:' lines
when running builds after pulling small updates from git.
- Added github workflow for making docker image and sphinx docs nightly
- Added github workflow for making build release on tag creation
### 1.7.34 (build 21823, api 8, 2024-04-26)
- Bumped Python version from 3.11 to 3.12 for all builds and project tools. One

View File

@ -64,4 +64,5 @@
### Loup Garou
- Added sphinx documentation generation
- Added docker build
- Added docker build system
- Various CI/CD improvements

123
Makefile
View File

@ -31,7 +31,7 @@ help: env
# Set env-var BA_ENABLE_COMPILE_COMMANDS_DB=1 to enable creating/updating a
# cmake compile-commands database for use with things like clangd.
ifeq ($(BA_ENABLE_COMPILE_COMMANDS_DB),1)
PREREQ_COMPILE_COMMANDS_DB = .cache/compile_commands_db/compile_commands.json
ENV_COMPILE_COMMANDS_DB = .cache/compile_commands_db/compile_commands.json
endif
# pcommandbatch can be much faster when running hundreds or thousands of
@ -46,19 +46,19 @@ else
PCOMMANDBATCH = $(PCOMMAND)
endif
# Prereq targets that should be safe to run anytime; even if project-files
# Env targets that should be safe to run anytime; even if project-files
# are out of date.
ENV_REQS_SAFE = .cache/checkenv $(PCOMMANDBATCHBIN) .dir-locals.el .mypy.ini \
.pyrightconfig.json .pylintrc .clang-format \
ballisticakit-cmake/.clang-format .editorconfig tools/cloudshell \
tools/bacloud
.pyrightconfig.json .pylintrc .clang-format \
ballisticakit-cmake/.clang-format .editorconfig tools/cloudshell \
tools/bacloud tools/pcommand
# Prereq targets that may break if the project needs updating should go here.
# Env targets that may break if the project needs updating should go here.
# An example is compile-command-databases; these might try to run cmake and
# fail if the CMakeList files don't match what's on disk. If such a target was
# included in ENV_REQS_SAFE it would try to build *before* project updates
# which would leave us stuck in a broken state.
ENV_REQS_POST_UPDATE_ONLY = $(PREREQ_COMPILE_COMMANDS_DB)
ENV_REQS_POST_UPDATE_ONLY = $(ENV_COMPILE_COMMANDS_DB)
# Target that should be built before building almost any other target. This
# installs tool config files, sets up the Python virtual environment, etc.
@ -1183,19 +1183,39 @@ clion-staging: assets-cmake resources meta
# #
################################################################################
docker-build: assets-cmake
$(PCOMMAND) build_docker
# Build the gui release docker image
docker-gui-release: assets-cmake
$(PCOMMAND) build_docker_gui_release
docker-run:
docker run -it bombsquad_server
# Build the gui debug docker image
docker-gui-debug: assets-cmake
$(PCOMMAND) build_docker_gui_debug
docker-save: docker-build
# Build the server release docker image
docker-server-release: assets-cmake
$(PCOMMAND) build_docker_server_release
# Build the server debug docker image
docker-server-debug: assets-cmake
$(PCOMMAND) build_docker_server_debug
# Build the gui release docker image for arm64
docker-arm64-gui-release: assets-cmake
$(PCOMMAND) build_docker_arm64_gui_release
# Build the server release docker image for arm64
docker-arm64-server-release: assets-cmake
$(PCOMMAND) build_docker_arm64_server_release
# Save the bombsquad_server docker image to build/docker/bombsquad_server_docker.tar
docker-save:
mkdir -p build/docker/
docker save bombsquad_server -o build/docker/bombsquad_server_docker.tar
$(PCOMMAND) save_docker_images
# Cleanup docker files
docker-clean:
rm build/docker/bombsquad_server_docker.tar
docker rmi bombsquad_server --force
rm -rf build/docker/
$(PCOMMAND) remove_docker_images
docker system prune
@ -1241,30 +1261,30 @@ CHECK_CLEAN_SAFETY = $(PCOMMAND) check_clean_safety
# Some tool configs that need filtering (mainly injecting projroot path).
TOOL_CFG_INST = $(PCOMMAND) tool_config_install
# Anything that affects tool-config generation.
# Anything required for tool-config generation.
TOOL_CFG_SRC = tools/efrotools/toolconfig.py config/projectconfig.json \
.venv/.efro_venv_complete tools/pcommand
tools/pcommand
# Anything that should trigger an environment-check when changed.
ENV_SRC = tools/batools/build.py .venv/.efro_venv_complete tools/pcommand
ENV_SRC = tools/batools/build.py .venv/.efro_venv_complete
# Generate a pcommand script hard-coded to use our virtual environment.
# This is a prereq dependency so should not itself depend on env.
tools/pcommand: tools/efrotools/genwrapper.py tools/efrotools/pyver.py
# This is an env dependency so should not itself depend on env.
tools/pcommand: tools/efrotools/genwrapper.py .venv/.efro_venv_complete
@echo Generating tools/pcommand...
@PYTHONPATH=tools python3 -m \
efrotools.genwrapper pcommand batools.pcommandmain tools/pcommand
# Generate a cloudshell script hard-coded to use our virtual environment.
# This is a prereq dependency so should not itself depend on env.
tools/cloudshell: tools/efrotools/genwrapper.py tools/efrotools/pyver.py
# This is an env dependency so should not itself depend on env.
tools/cloudshell: tools/efrotools/genwrapper.py .venv/.efro_venv_complete
@echo Generating tools/cloudshell...
@PYTHONPATH=tools python3 -m \
efrotools.genwrapper cloudshell efrotoolsinternal.cloudshell tools/cloudshell
# Generate a bacloud script hard-coded to use our virtual environment.
# This is a prereq dependency so should not itself depend on env.
tools/bacloud: tools/efrotools/genwrapper.py tools/efrotools/pyver.py
# This is an env dependency so should not itself depend on env.
tools/bacloud: tools/efrotools/genwrapper.py .venv/.efro_venv_complete
@echo Generating tools/bacloud...
@PYTHONPATH=tools python3 -m \
efrotools.genwrapper bacloud batools.bacloud tools/bacloud
@ -1296,40 +1316,54 @@ SKIP_ENV_CHECKS ?= 0
VENV_PYTHON ?= python3.12
# Increment this to force all downstream venvs to fully rebuild. Useful after
# removing requirements since upgrading in place will never uninstall stuff.
# removing requirements since upgrading venvs in place will never uninstall
# stuff.
VENV_STATE = 1
# Rebuild our virtual environment whenever reqs, Python version, or explicit
# state number changes. This is a dependency of env so it should not itself
# depend on env. Note that we list pcommand as a requirement but can't use it
# in here until the end when the venv is up. Also note that we try to update
# venvs in place when possible, but when Python version or venv-state changes
# we blow it away and start over to be safe.
.venv/.efro_venv_complete: tools/pcommand config/requirements.txt \
tools/efrotools/pyver.py
# Update our virtual environment whenever reqs changes, Python version
# changes, our venv's Python symlink breaks (can happen for minor Python
# updates), or explicit state number changes. This is a dependency of env so
# should not itself depend on env.
.venv/.efro_venv_complete: \
config/requirements.txt \
tools/efrotools/pyver.py \
.venv/bin/$(VENV_PYTHON) \
.venv/.efro_venv_state_$(VENV_STATE)
# Update venv in place when possible; otherwise create from scratch.
@[ -f .venv/bin/$(VENV_PYTHON) ] \
&& [ -f .venv/.efro_venv_state_$(VENV_STATE) ] \
&& echo Updating existing $(VENV_PYTHON) virtual environment in \'.venv\'... \
|| (echo Creating new $(VENV_PYTHON) virtual environment in \'.venv\'... \
&& rm -rf .venv)
$(VENV_PYTHON) -m venv .venv
&& rm -rf .venv && $(VENV_PYTHON) -m venv .venv \
&& touch .venv/.efro_venv_state_$(VENV_STATE))
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -r config/requirements.txt
touch .venv/.efro_venv_state_$(VENV_STATE) \
.venv/.efro_venv_complete # Done last to enforce fully-built venvs.
@$(PCOMMAND) echo \
GRN Project virtual environment for BLD $(VENV_PYTHON) RST GRN \
at BLD .venv RST GRN is ready to use.
@touch .venv/.efro_venv_complete # Done last to signal fully-built venv.
@echo Project virtual environment for $(VENV_PYTHON) at .venv is ready to use.
.cache/checkenv: $(ENV_SRC)
# We don't actually create anything with this target, but its existence allows
# .efro_venv_complete to run when these bits don't exist, and that target
# *does* recreate this stuff. Note to self: previously I tried splitting
# things up more and recreating the venv in this target, but that led to
# unintuitive dependency behavior. For example, a python update could cause
# the .venv/bin/$(VENV_PYTHON) symlink to break, which would cause that target
# to blow away and rebuild the venv, but then the reestablished symlink might
# have an old modtime (since modtime is that of python itself) which could
# cause .efro_venv_complete to think it was already up to date and not run,
# leaving us with a half-built venv. So the way we do it now ensures the venv
# update always happens in full and seems mostly foolproof.
.venv/bin/$(VENV_PYTHON) .venv/.efro_venv_state_$(VENV_STATE):
.cache/checkenv: $(ENV_SRC) $(PCOMMAND)
@if [ $(SKIP_ENV_CHECKS) -ne 1 ]; then \
$(PCOMMAND) checkenv && mkdir -p .cache && touch .cache/checkenv; \
fi
$(PCOMMANDBATCHBIN): src/tools/pcommandbatch/pcommandbatch.c \
PCOMMANDBATCHSRC = src/tools/pcommandbatch/pcommandbatch.c \
src/tools/pcommandbatch/cJSON.c
@$(MAKE) tools/pcommand
@$(PCOMMAND) build_pcommandbatch $^ $@
$(PCOMMANDBATCHBIN): $(PCOMMANDBATCHSRC) $(PCOMMAND)
@$(PCOMMAND) build_pcommandbatch $(PCOMMANDBATCHSRC) $(PCOMMANDBATCHBIN)
# CMake build-type lowercase
CM_BT_LC = $(shell echo $(CMAKE_BUILD_TYPE) | tr A-Z a-z)
@ -1364,6 +1398,7 @@ ballisticakit-cmake/.clang-format: .clang-format
# compile commands for all files; lets try to keep it up to date
# whenever CMakeLists changes.
.cache/compile_commands_db/compile_commands.json: \
$(PCOMMANDBATCH) \
ballisticakit-cmake/CMakeLists.txt
@$(PCOMMANDBATCH) echo BLU Updating compile commands db...
@mkdir -p .cache/compile_commands_db

View File

@ -1,21 +1,26 @@
# if provided it will make debug build
ARG cmake_build_type=Release
# system to start with the build with
# currently will break for non ubuntu system
ARG base_image=ubuntu:24.04
# whether to make GUI or headless build (defaults to headless)
ARG headless_build=1
# system to start with the build with
# currently will break for other images
ARG base_image=ubuntu:latest
#-------------------------------BUILDER--------------------------------
# Start with the base image
FROM ${base_image} AS builder
# Renew the arg
# Renew the args
ARG headless_build
ARG cmake_build_type
ENV LANG en_US.utf8
# Environment settings
ENV LANG=en_US.utf8
ENV LANGUAGE=en_US
ENV LC_ALL=en_US.utf8
ENV DEBIAN_FRONTEND=noninteractive
ENV CMAKE_BUILD_TYPE=${cmake_build_type}
ENV HEADLESS_BUILD=${headless_build}
# Install build dependencies
RUN apt-get update -y && \
@ -24,62 +29,75 @@ RUN apt-get update -y && \
python3.12-venv \
python3-pip \
libsdl2-dev \
libvorbisfile3 \
freeglut3-dev \
libglut-dev \
libopenal-dev \
libvorbis-dev \
make \
curl \
rsync \
clang-format \
cmake \
libvorbis-dev
cmake
# Copy source code
COPY ./ /home/ubuntu/ballistica
COPY ./ /ballistica
WORKDIR /home/ubuntu/ballistica
# Set the working directory
WORKDIR /ballistica
# Compile the application
RUN make cmake-server-build \
&& mkdir ./../ballistica_cmake_server \
&& mv build/cmake/* ./../ballistica_cmake_server
RUN mkdir /ballistica_cmake && \
if [ "$HEADLESS_BUILD" != "0" ]; then \
make cmake-server-build && \
mv build/cmake/*/ballisticakit_headless build/cmake/*/staged/dist; \
else \
make cmake-build && \
mv build/cmake/*/ballisticakit build/cmake/*/staged/; \
fi && \
mv build/cmake/*/staged/* /ballistica_cmake
#-------------------------------RUNNER--------------------------------
# Create a new stage for the runtime environment
FROM ${base_image}
# Environment settings
ENV LANG en_US.utf8
ENV LANGUAGE=en_US
ENV LC_ALL=en_US.utf8
ENV DEBIAN_FRONTEND=noninteractive
# Renew the arg
# Renew the args
ARG headless_build
ENV HEADLESS_BUILD=${headless_build}
ARG cmake_build_type
LABEL BUILD_TYPE=${cmake_build_type}
ARG bombsquad_build=N/A
LABEL BOMBSQUAD_BUILD=${bombsquad_build}
ARG bombsquad_version=N/A
LABEL BOMBSQUAD_VERSION=${bombsquad_version}
LABEL BOMBSQUAD_BUILD_TYPE=${cmake_build_type}
# Install runtime dependencies
RUN apt-get update -y && \
apt-get install -y \
python3.12-dev \
&& rm -rf /var/lib/apt/lists/* \
&& python3.12 -c "import uuid;print(uuid.uuid4())">/etc/machine-id
apt-get install -y \
python3.12-dev && \
if [ "$HEADLESS_BUILD" = "0" ]; then \
apt-get install -y \
libsdl2-dev \
libvorbis-dev \
libglut-dev \
libopenal-dev; \
fi && \
rm -rf /var/lib/apt/lists/* && \
python3.12 -c "import uuid; print(uuid.uuid4())" > /etc/machine-id
# Copy the compiled application from the builder stage
COPY --from=builder /home/ubuntu/ballistica_cmake_server/*/staged \
COPY --from=builder /ballistica_cmake \
/home/ubuntu/ballistica
# ballisticakit_headless in staged is a symlink
COPY --from=builder /home/ubuntu/ballistica_cmake_server/*/ballisticakit_headless \
/home/ubuntu/ballistica/dist
# Set the working directory
WORKDIR /home/ubuntu/ballistica
RUN ln -s ballisticakit* run
# Expose the necessary port
EXPOSE 43210/udp
# Set the default command to run the application
CMD [ "./ballisticakit_server" ]
CMD [ "./run" ]

View File

@ -0,0 +1,102 @@
# if provided it will make debug build
ARG cmake_build_type=Release
# whether to make GUI or headless build (defaults to headless)
ARG headless_build=1
# system to start with the build with
# currently will break for other images
ARG base_image=ubuntu:latest
#-------------------------------BUILDER--------------------------------
# Start with the base image
FROM --platform=linux/arm64 ${base_image} AS builder
# Renew the args
ARG headless_build
ARG cmake_build_type
# Environment settings
ENV LANG=en_US.utf8
ENV LANGUAGE=en_US
ENV LC_ALL=en_US.utf8
ENV DEBIAN_FRONTEND=noninteractive
ENV CMAKE_BUILD_TYPE=${cmake_build_type}
ENV HEADLESS_BUILD=${headless_build}
# Install build dependencies
RUN apt-get install -y --no-install-recommends \
python3.12-dev \
python3.12-venv \
python3-pip \
libsdl2-dev \
libglut-dev \
libopenal-dev \
make \
curl \
rsync \
clang-format \
clang \
cmake \
libvorbis-dev \
build-essential
# Copy source code
COPY ./ /ballistica
# Set the working directory
WORKDIR /ballistica
# Compile the application
RUN mkdir /ballistica_cmake && \
if [ "$HEADLESS_BUILD" != "0" ]; then \
make cmake-server-build && \
mv build/cmake/*/ballisticakit_headless build/cmake/*/staged/dist; \
else \
make cmake-build && \
mv build/cmake/*/ballisticakit build/cmake/*/staged/; \
fi && \
mv build/cmake/*/staged/* /ballistica_cmake
#-------------------------------RUNNER--------------------------------
# Create a new stage for the runtime environment using ARM64 base image
FROM --platform=linux/arm64 ${base_image}
# Environment settings
ENV LANG en_US.utf8
ENV LANGUAGE=en_US
ENV LC_ALL=en_US.utf8
ENV DEBIAN_FRONTEND=noninteractive
# Renew the args
ARG headless_build
ENV HEADLESS_BUILD=${headless_build}
ARG cmake_build_type
LABEL BOMBSQUAD_BUILD_TYPE=${cmake_build_type}
# Install runtime dependencies
RUN apt-get update -y && \
apt-get install -y \
python3.12-dev && \
if [ "$HEADLESS_BUILD" = "0" ]; then \
apt-get install -y \
libsdl2-dev \
libvorbis-dev \
libglut-dev \
libopenal-dev; \
fi && \
rm -rf /var/lib/apt/lists/* && \
python3.12 -c "import uuid; print(uuid.uuid4())" > /etc/machine-id
# Copy the compiled application from the builder stage
COPY --from=builder /ballistica_cmake \
/home/ubuntu/ballistica
# Set the working directory
WORKDIR /home/ubuntu/ballistica
RUN ln -s ballisticakit* run
# Expose the necessary port
EXPOSE 43210/udp
# Set the default command to run the application
CMD [ "./run" ]

View File

@ -1,14 +1,14 @@
cpplint==1.6.1
dmgbuild==1.6.1
filelock==3.14.0
filelock==3.15.1
furo==2024.5.6
mypy==1.10.0
pbxproj==4.1.0
pdoc==14.5.0
pur==7.3.1
pylint==3.2.2
pur==7.3.2
pylint==3.2.3
pylsp-mypy==0.6.8
pytest==8.2.1
pytest==8.2.2
python-daemon==3.0.1
python-lsp-black==2.0.0
python-lsp-server==1.11.0
@ -17,5 +17,5 @@ Sphinx==7.3.7
tomlkit==0.12.5
types-certifi==2021.10.8.3
types-filelock==3.2.7
types-requests==2.32.0.20240523
typing_extensions==4.12.0
types-requests==2.32.0.20240602
typing_extensions==4.12.2

View File

@ -196,6 +196,8 @@ ctx.filter_file_names = {
'ci.yml',
'cd.yml',
'deploy_docs.yml',
'nightly.yml',
'release.yml',
'LICENSE',
'cloudtool',
'bacloud',

View File

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

View File

@ -64,8 +64,8 @@ auto BasePlatform::GetPublicDeviceUUID() -> std::string {
// We used to plug version in directly here, but that caused uuids to
// shuffle too rapidly during periods of rapid development. This
// keeps it more constant.
// __last_rand_uuid_component_shuffle_date__ 2023 12 13
auto rand_uuid_component{"7YM96RZHN6ZCPZGTQONULZO1JU5NMMC7"};
// __last_rand_uuid_component_shuffle_date__ 2024 6 13
auto rand_uuid_component{"1URRE62C7234VP9L1BUPJ1P7QT7Q8YW3"};
inputs.emplace_back(rand_uuid_component);
auto gil{Python::ScopedInterpreterLock()};

View File

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

View File

@ -644,59 +644,3 @@ def cmake_prep_dir(dirname: str, verbose: bool = False) -> None:
else:
if verbose:
print(f'{Clr.BLD}{title}:{Clr.RST} Keeping existing build dir.')
def _docker_build(
image_name: str,
dockerfile_dir: str,
bombsquad_version: str | None = None,
bombsquad_build: str | int | None = None,
cmake_build_type: str | None = None,
) -> None:
build_cmd = [
'docker',
'image',
'build',
'-t',
image_name,
'-f',
dockerfile_dir,
'.',
]
if bombsquad_version is not None:
build_cmd = build_cmd + [
'--build-arg',
f'bombsquad_version={bombsquad_version}',
]
if bombsquad_build is not None:
build_cmd = build_cmd + [
'--build-arg',
f'bombsquad_build={str(bombsquad_build)}',
]
if cmake_build_type is not None:
build_cmd = build_cmd + [
'--build-arg',
f'cmake_build_type={cmake_build_type}',
]
subprocess.run(build_cmd, check=True)
def docker_build() -> None:
"""Build docker image."""
# todo: add option to toggle between prefab and cmake
from batools import version
version_num, build_num = version.get_current_version()
image_name = 'bombsquad_server'
print(
f'Building docker image {image_name}'
+ 'version {version_num}:{build_num}'
)
_docker_build(
image_name,
'config/docker/Dockerfile',
version_num,
build_num,
)

173
tools/batools/docker.py Normal file
View File

@ -0,0 +1,173 @@
# Released under the MIT License. See LICENSE for details.
#
"""General functionality related to docker builds."""
import subprocess
def _docker_build(
image_name: str,
dockerfile_dir: str,
cmake_build_type: str | None = None,
labels: dict[str, str] | None = None,
platform: str | None = None,
headless_build: bool | str | None = None,
) -> None:
build_cmd = [
'docker',
'buildx',
'build',
'--tag',
image_name,
'--file',
dockerfile_dir,
'--load',
'.',
]
if cmake_build_type is not None:
build_cmd = build_cmd + [
'--build-arg',
f'cmake_build_type={cmake_build_type}',
]
if headless_build is not None:
if headless_build:
headless_build = '1'
else:
headless_build = '0'
build_cmd = build_cmd + [
'--build-arg',
f'headless_build={headless_build}',
]
if platform is not None:
build_cmd = build_cmd + [
'--platform',
platform,
]
if labels is not None:
build_cmd = build_cmd + [
f'--label={i}={labels[i]}' for i in labels.keys()
]
subprocess.run(build_cmd, check=True)
def docker_build(
platform: str | None = 'linux/amd64',
headless_build: bool | str | None = None,
build_type: str | None = None,
) -> None:
"""Build docker image.
platform == 'linux/arm64' or platform == 'linux/amd64'"""
from batools import version
version_num, build_num = version.get_current_version()
if headless_build is None:
headless_build = True
if build_type is None:
build_type = 'Release'
image_name = get_docker_image_name(
headless_build=headless_build, build_type=build_type
)
if platform is not None and 'arm64' in platform:
config_file = 'config/docker/Dockerfile_arm64'
else:
config_file = 'config/docker/Dockerfile'
print(
f'Building docker image {image_name} '
+ f'version {version_num}:{build_num}'
)
_docker_build(
image_name,
config_file,
labels={
'bombsquad_version': version_num,
'bombsquad_build': str(build_num),
},
platform=platform,
headless_build=headless_build,
cmake_build_type=build_type,
)
def get_docker_image_name(headless_build: bool | str, build_type: str) -> str:
"""Get name of docker images in predefined format."""
name = 'bombsquad'
if headless_build:
name += '_server'
else:
name += '_gui'
if 'release' in build_type.lower():
name += '_release'
else:
name += '_debug'
return name
def docker_save_images() -> None:
"""Saves bombsquad images loaded into docker."""
output = subprocess.run(
['docker', 'images'], capture_output=True, text=True, check=True
)
save_cmd = ['docker', 'save', '-o']
# we expect this directory is already present from Makefile
build_save_dir = 'build/docker/'
img_name = get_docker_image_name(headless_build=True, build_type='Release')
if img_name in output.stdout:
subprocess.run(
save_cmd + [build_save_dir + img_name + '_docker.tar', img_name],
check=True,
)
img_name = get_docker_image_name(headless_build=True, build_type='Debug')
if img_name in output.stdout:
subprocess.run(
save_cmd + [build_save_dir + img_name + '_docker.tar', img_name],
check=True,
)
img_name = get_docker_image_name(headless_build=False, build_type='Release')
if img_name in output.stdout:
subprocess.run(
save_cmd + [build_save_dir + img_name + '_docker.tar', img_name],
check=True,
)
img_name = get_docker_image_name(headless_build=False, build_type='Debug')
if img_name in output.stdout:
subprocess.run(
save_cmd + [build_save_dir + img_name + '_docker.tar', img_name],
check=True,
)
def docker_remove_images() -> None:
"""Remove the bombsquad images loaded in docker."""
output = subprocess.run(
['docker', 'images'], capture_output=True, text=True, check=True
)
remove_cmd = [
'docker',
'rmi',
]
img_name = get_docker_image_name(headless_build=True, build_type='Release')
if img_name in output.stdout:
subprocess.run(remove_cmd + [img_name], check=True)
img_name = get_docker_image_name(headless_build=True, build_type='Debug')
if img_name in output.stdout:
subprocess.run(remove_cmd + [img_name], check=True)
img_name = get_docker_image_name(headless_build=False, build_type='Release')
if img_name in output.stdout:
subprocess.run(remove_cmd + [img_name], check=True)
img_name = get_docker_image_name(headless_build=False, build_type='Debug')
if img_name in output.stdout:
subprocess.run(remove_cmd + [img_name], check=True)

View File

@ -104,7 +104,14 @@ from batools.pcommands import (
ensure_prefab_platform,
prefab_run_var,
prefab_binary_path,
build_docker,
build_docker_gui_release,
build_docker_gui_debug,
build_docker_server_release,
build_docker_server_debug,
build_docker_arm64_gui_release,
build_docker_arm64_server_release,
save_docker_images,
remove_docker_images,
make_prefab,
lazybuild,
efro_gradle,

View File

@ -9,6 +9,8 @@ import sys
from efrotools import pcommand
# pylint: disable=too-many-lines
def prune_includes() -> None:
"""Check for unnecessary includes in C++ files.
@ -667,11 +669,60 @@ def prefab_binary_path() -> None:
)
def build_docker() -> None:
"""Build the docker image with bombsquad cmake server."""
import batools.build
def build_docker_gui_release() -> None:
"""Build the docker image with bombsquad cmake gui."""
import batools.docker
batools.build.docker_build()
batools.docker.docker_build(headless_build=False)
def build_docker_gui_debug() -> None:
"""Build the docker image with bombsquad debug cmake gui."""
import batools.docker
batools.docker.docker_build(headless_build=False, build_type='Debug')
def build_docker_server_release() -> None:
"""Build the docker image with bombsquad cmake server."""
import batools.docker
batools.docker.docker_build()
def build_docker_server_debug() -> None:
"""Build the docker image with bombsquad debug cmake server."""
import batools.docker
batools.docker.docker_build(build_type='Debug')
def build_docker_arm64_gui_release() -> None:
"""Build the docker image with bombsquad cmake for arm64."""
import batools.docker
batools.docker.docker_build(headless_build=False, platform='linux/arm64')
def build_docker_arm64_server_release() -> None:
"""Build the docker image with bombsquad cmake server for arm64."""
import batools.docker
batools.docker.docker_build(platform='linux/arm64')
def save_docker_images() -> None:
"""Saves bombsquad images loaded into docker."""
import batools.docker
batools.docker.docker_save_images()
def remove_docker_images() -> None:
"""Remove the bombsquad images loaded in docker."""
import batools.docker
batools.docker.docker_remove_images()
def make_prefab() -> None:

View File

@ -73,9 +73,9 @@ class RemoteError(Exception):
occurs remotely. The error string can consist of a remote stack
trace or a simple message depending on the context.
Communication systems should raise more specific error types locally
when more introspection/control is needed; this is intended somewhat
as a catch-all.
Communication systems should aim to communicate specific errors
gracefully as standard message responses when specific details are
needed; this is intended more as a catch-all.
"""
def __init__(self, msg: str, peer_desc: str):

View File

@ -45,7 +45,7 @@ class MessageProtocol:
forward_communication_errors: bool = False,
forward_clean_errors: bool = False,
remote_errors_include_stack_traces: bool = False,
log_remote_errors: bool = True,
log_errors_on_receiver: bool = True,
) -> None:
"""Create a protocol with a given configuration.
@ -62,8 +62,8 @@ class MessageProtocol:
When an exception is not covered by the optional forwarding
mechanisms above, it will come across as efro.error.RemoteError
and the exception will be logged on the receiver
end - at least by default (see details below).
and the exception will be logged on the receiver end - at least
by default (see details below).
If 'remote_errors_include_stack_traces' is True, stringified
stack traces will be returned with efro.error.RemoteError
@ -77,8 +77,8 @@ class MessageProtocol:
goal is usually to avoid returning opaque RemoteErrors and to
instead return something meaningful as part of the expected
response type (even if that value itself represents a logical
error state). If 'log_remote_errors' is False, however, such
exceptions will not be logged on the receiver. This can be
error state). If 'log_errors_on_receiver' is False, however, such
exceptions will *not* be logged on the receiver. This can be
useful in combination with 'remote_errors_include_stack_traces'
and 'forward_clean_errors' in situations where all error
logging/management will be happening on the sender end. Be
@ -168,7 +168,7 @@ class MessageProtocol:
self.remote_errors_include_stack_traces = (
remote_errors_include_stack_traces
)
self.log_remote_errors = log_remote_errors
self.log_errors_on_receiver = log_errors_on_receiver
@staticmethod
def encode_dict(obj: dict) -> str:
@ -219,7 +219,7 @@ class MessageProtocol:
),
error_type=ErrorSysResponse.ErrorType.REMOTE,
),
self.log_remote_errors,
self.log_errors_on_receiver,
)
def _to_dict(

View File

@ -38,6 +38,7 @@ class MessageReceiver:
# MyMessageReceiver fills out handler() overloads to ensure all
# registered handlers have valid types/return-types.
@receiver.handler
def handle_some_message_type(self, message: SomeMsg) -> SomeResponse:
# Deal with this message type here.
@ -47,7 +48,7 @@ class MessageReceiver:
obj.receiver.handle_raw_message(some_raw_data)
Any unhandled Exception occurring during message handling will result in
an Exception being raised on the sending end.
an efro.error.RemoteError being raised on the sending end.
"""
is_async = False

View File

@ -20,22 +20,33 @@ if TYPE_CHECKING:
class MessageSender:
"""Facilitates sending messages to a target and receiving responses.
This is instantiated at the class level and used to register unbound
class methods to handle raw message sending.
These are instantiated at the class level and used to register unbound
class methods to handle raw message sending. Generally this class is not
used directly, but instead autogenerated subclasses which provide type
safe overloads are used instead.
Example:
(In this example, MyMessageSender is an autogenerated class that
inherits from MessageSender).
class MyClass:
msg = MyMessageSender(some_protocol)
msg = MyMessageSender()
@msg.send_method
def send_raw_message(self, message: str) -> str:
# Actually send the message here.
# MyMessageSender class should provide overloads for send(), send_async(),
# etc. to ensure all sending happens with valid types.
obj = MyClass()
obj.msg.send(SomeMessageType())
# The MyMessageSender generated class would provides overloads for
# send(), send_async(), etc. to provide type-safety for message types
# and their associated response types.
# Thus, given the statement below, a type-checker would know that
# 'response' is a SomeResponseType or whatever is associated with
# SomeMessageType.
response = obj.msg.send(SomeMessageType())
"""
def __init__(self, protocol: MessageProtocol) -> None:

View File

@ -480,6 +480,17 @@ def apple_patch(python_dir: str) -> None:
"""New test."""
patch_modules_setup(python_dir, 'apple')
# Filter an instance of 'itms-services' that appeared in Python3.12
# and which was getting me rejected from the app store.
fname = os.path.join(python_dir, 'Lib', 'urllib', 'parse.py')
ftxt = readfile(fname)
ftxt = replace_exact(
ftxt,
"'wss', 'itms-services']",
"'wss', 'i!t!m!s!-!s!e!r!v!i!c!e!s'.replace('!', '')]",
)
writefile(fname, ftxt)
def patch_modules_setup(python_dir: str, baseplatform: str) -> None:
"""Muck with the Setup.* files Python uses to build modules."""