diff --git a/.efrocachemap b/.efrocachemap index 62b7c7dd..d43fdca8 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -424,7 +424,7 @@ "build/assets/ba_data/data/langdata.json": "dca47b4976752e76e852f7a4be2c7aa3", "build/assets/ba_data/data/languages/arabic.json": "e0001d8542c904bc3c98a174f256efd9", "build/assets/ba_data/data/languages/belarussian.json": "7fe38341815ca6ff4d95224196e7a67e", - "build/assets/ba_data/data/languages/chinese.json": "a87b1ebef100d9cdce0d29123735e90c", + "build/assets/ba_data/data/languages/chinese.json": "4e2f4f1f38216940953fcbee4da1563e", "build/assets/ba_data/data/languages/chinesetraditional.json": "f858da49be0a5374157c627857751078", "build/assets/ba_data/data/languages/croatian.json": "766532c67af5bd0144c2d63cab0516fa", "build/assets/ba_data/data/languages/czech.json": "93c5fe0d884d95435da6c675f64e30e0", @@ -440,17 +440,17 @@ "build/assets/ba_data/data/languages/hindi.json": "8ea0c58a44a24edb131d0e53b074d1f6", "build/assets/ba_data/data/languages/hungarian.json": "796a290a8c44a1e7635208c2ff5fdc6e", "build/assets/ba_data/data/languages/indonesian.json": "ba39cade3c965b2ddbee122880b6f0db", - "build/assets/ba_data/data/languages/italian.json": "b19a9f0b868a6c89e13a04609bf377dd", + "build/assets/ba_data/data/languages/italian.json": "cda5760f247500657722c279bc2f2bc7", "build/assets/ba_data/data/languages/korean.json": "ca1122a9ee551da3f75ae632012bd0e2", "build/assets/ba_data/data/languages/malay.json": "832562ce997fc70704b9234c95fb2e38", - "build/assets/ba_data/data/languages/persian.json": "89f5c6f900317aaa20ec520e5fd65d32", + "build/assets/ba_data/data/languages/persian.json": "4f448b29ba04f2b789329600cb7f9ab7", "build/assets/ba_data/data/languages/polish.json": "8bb8f7baa5efcf6cdd627140d209c2b2", "build/assets/ba_data/data/languages/portuguese.json": "7374b6a5cadcf573ee4ab4a5b4bc8c0a", "build/assets/ba_data/data/languages/romanian.json": "aeebdd54f65939c2facc6ac50c117826", "build/assets/ba_data/data/languages/russian.json": "9e068a3afdec43b207c83aedfb812e82", "build/assets/ba_data/data/languages/serbian.json": "d7452dd72ac0e51680cb39b5ebaa1c69", "build/assets/ba_data/data/languages/slovak.json": "27962d53dc3f7dd4e877cd40faafeeef", - "build/assets/ba_data/data/languages/spanish.json": "0fca8361c6873e6445f0bea34a211b78", + "build/assets/ba_data/data/languages/spanish.json": "f73b0d4d534f030f95c00385bb06cbc1", "build/assets/ba_data/data/languages/swedish.json": "5142a96597d17d8344be96a603da64ac", "build/assets/ba_data/data/languages/tamil.json": "b4de1a2851afe4869c82e9acd94cd89c", "build/assets/ba_data/data/languages/thai.json": "33f63753c9af9a5b238d229a0bf23fbc", @@ -4056,50 +4056,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": "a2c1b1a31a42a24e5f2188983ff97c0e", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "8d146105a6df3376ec2f575401f29ec2", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "5e0e63f5fea108212bfb35c4fdc05dd2", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "85797e98f9a21f168a986b7eb3219688", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "95bc2213d2fb30e8248ddf06764a3663", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "f09d7055120d50f37b605ff3a4cbf61d", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "8f23de3825b9e9cf6ed4715125aeb956", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "f7b88875b37a39db57d77bebb05f822f", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "0b719dc609de364814299a5baa9a5b0b", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "07aa53835bdd2d2a4113d61a89a7da1d", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "1a1c4db580157e38effe4b81c35aca52", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "1e44d0a7160d442b1eb4d348952b0d06", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "a85fcf6a12483bde66559dbdce88b730", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "d53e31771fe31615c66bd0d1e1292b2f", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "e1804380d5ebec56f8f0af2e2547316e", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "d9665cdf870247b6d8e9475419b04038", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "0cac36823713816d03a6922b96cecd0a", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "bd741122315ced7b703de1fed2d372cd", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "f11edd5da3ce1a3e804bfc61b7ca9c1e", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "3d647f5f63b3ac3900903cf72496cef2", - "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "f812111f1eb4ea76e99558305ce3980f", - "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "c16c1b360b27850f1ac4d3dc55194b0a", - "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "f812111f1eb4ea76e99558305ce3980f", - "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "c16c1b360b27850f1ac4d3dc55194b0a", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "473c84d44b472d3ae73df6a2f1b56839", - "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "970c415cbb7a3087a163fa6e96e634a1", - "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "473c84d44b472d3ae73df6a2f1b56839", - "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "970c415cbb7a3087a163fa6e96e634a1", - "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "86498db547380838a1c95b45ef17d28b", - "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "bf11ae92718ae3dd5116d623799dd27f", - "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "86498db547380838a1c95b45ef17d28b", - "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "bf11ae92718ae3dd5116d623799dd27f", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "147c5a5210a55978060381cc44a122db", - "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "380d456bc409849174a36c5d2f61aa1b", - "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "4fae9b286a6d1c5c729c49c483c1422a", - "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "380d456bc409849174a36c5d2f61aa1b", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "93f75d31841fe18d6bc66681c99b05a1", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "cd6500ab076fa3bdff92fc8b65bc1d64", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "0dcde1146f11e4cfd3d609f4330f7a9a", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "663e6ed62de0f857fd9a4de57067dbd3", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "ae28db2f400d3b778d4a011a72339757", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "3b13cdbaf70cf43d0a14b7a2dd744945", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "54798340a1dfedaa9052aeee180e28ff", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "18b635d88c074261a3be4f45e8244340", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "66647fb41b54b221cf4189161a696698", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "81a9bec829a30860a260df58c258b7d0", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "1930fa43a702b2fd3601b032afd9ad31", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "e9fdc1e724495d36a1ae9c1898b2dbeb", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "5cb78d708e8dc3911d1e5a345e535bd2", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "9aa815a258a476f02490cf58db28340a", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "dd932540bbef37a3e0580ef81206090c", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "d34c3fcf54ae4c362dafb442e5e2e57a", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "a74979683c4e58bfefde5235996551db", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "cbbecde45fb204a8f39cbf5448d248a2", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "37d71f1f72191bb29645146a5d7fdd09", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "10cb64bd655ad3ff562496bb66693dd6", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "7d9ab35e63602e682a533495022728d3", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "d98edee305c488c3a082ef98deae8a6c", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "a12f0a05ed17ef48554356b6087cdee0", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "de7e6c726c6ace4bba28f59a84cdf6b5", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "fd7b381ca67b31c088d4e98b6c0ddfe1", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "1d074c3b15b2bdf6c32e145ea83f1fa2", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "0b47cfab278418386ac29009402c9f59", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "213a68414bac47cbe051db9fbb0cbb43", + "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "a5e255155289f502a6662e5f9bb7819c", + "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "ae044789e56e5d2999f55e2f4eeb6a4d", + "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "a5e255155289f502a6662e5f9bb7819c", + "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "ae044789e56e5d2999f55e2f4eeb6a4d", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "48d81af91942519355b066d7bf8d3468", + "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "2c4f37722cb283a8405f35a0c9bbbfbb", + "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "48d81af91942519355b066d7bf8d3468", + "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "2c4f37722cb283a8405f35a0c9bbbfbb", + "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "09abcf532a2c0fba00e5e7860f495ba8", + "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "699291d36e42e3214946aab9798446ea", + "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "09abcf532a2c0fba00e5e7860f495ba8", + "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "699291d36e42e3214946aab9798446ea", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "ef1356360fb3701b0976a0ef37eae4bf", + "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "50cfe82580f1ef2698c5508f46bd2e4c", + "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "7b6afdb6b8d8722cbcee3bff944ec038", + "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "50cfe82580f1ef2698c5508f46bd2e4c", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "b29d085453e251a7e6866ac7efcd0513", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "e8da891dd0f5a441d781793f641f215d", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "982dc78eabf4eca6ccbfd3bf2537c706", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "d02505b956c8a0d5b2cb310408492df6", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "c95c26eed8a2c5e8573d35c58b2c99f2", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "d5a04d68e7818912b1f689fb1a3e8b53", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "b612531dedbb057f48868e43ce05636a", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "499914dfdd9a5fd051013ab5ae845f41", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "28323912b56ec07701eda3d41a6a4101", "src/ballistica/base/mgen/pyembed/binding_base.inc": "72bfed2cce8ff19741989dec28302f3f", diff --git a/CHANGELOG.md b/CHANGELOG.md index 650440be..5125064f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ -### 1.7.28 (build 21583, api 8, 2023-11-09) +### 1.7.28 (build 21585, api 8, 2023-11-10) +- Turning off ticket continues on all platforms. I'll be moving the game towards + a new monetization scheme mostly based on cosmetics and this has always felt a + bit ugly pay-to-win to me, so it's time for it to go. Note that the + functionality is still in there if anyone wants to support it in mods. - Massively cleaned up code related to rendering and window systems (OpenGL, SDL, etc). This code had been growing into a nasty tangle for 15 years attempting to support various old/hacked versions of SDL, etc. I ripped out diff --git a/src/assets/ba_data/python/babase/__init__.py b/src/assets/ba_data/python/babase/__init__.py index 3b0c723a..b2a12abe 100644 --- a/src/assets/ba_data/python/babase/__init__.py +++ b/src/assets/ba_data/python/babase/__init__.py @@ -156,7 +156,7 @@ from babase._general import ( ) from babase._keyboard import Keyboard from babase._language import Lstr, LanguageSubsystem -from babase._login import LoginAdapter +from babase._login import LoginAdapter, LoginInfo # noinspection PyProtectedMember # (PyCharm inspection bug?) @@ -265,6 +265,7 @@ __all__ = [ 'LanguageSubsystem', 'lock_all_input', 'LoginAdapter', + 'LoginInfo', 'Lstr', 'mac_music_app_get_playlists', 'mac_music_app_get_volume', diff --git a/src/assets/ba_data/python/babase/_accountv2.py b/src/assets/ba_data/python/babase/_accountv2.py index d1baa52d..8738b8f1 100644 --- a/src/assets/ba_data/python/babase/_accountv2.py +++ b/src/assets/ba_data/python/babase/_accountv2.py @@ -16,7 +16,7 @@ import _babase if TYPE_CHECKING: from typing import Any - from babase._login import LoginAdapter + from babase._login import LoginAdapter, LoginInfo DEBUG_LOG = False @@ -27,7 +27,7 @@ class AccountV2Subsystem: Category: **App Classes** - Access the single shared instance of this class at 'ba.app.accounts'. + Access the single shared instance of this class at 'ba.app.plus.accounts'. """ def __init__(self) -> None: @@ -425,7 +425,7 @@ class AccountV2Handle: tag: str workspacename: str | None workspaceid: str | None - logins: dict[LoginType, str] + logins: dict[LoginType, LoginInfo] def __enter__(self) -> None: """Support for "with" statement. diff --git a/src/assets/ba_data/python/babase/_login.py b/src/assets/ba_data/python/babase/_login.py index 63cbd450..e8884034 100644 --- a/src/assets/ba_data/python/babase/_login.py +++ b/src/assets/ba_data/python/babase/_login.py @@ -20,6 +20,13 @@ if TYPE_CHECKING: DEBUG_LOG = False +@dataclass +class LoginInfo: + """Basic info about a login available in the app.plus.accounts section.""" + + name: str + + class LoginAdapter: """Allows using implicit login types in an explicit way. @@ -293,7 +300,7 @@ class LoginAdapter: def _update_implicit_login_state(self) -> None: # If we've received an implicit login state, schedule it to be - # sent along to the app. We wait until on-app-launch has been + # sent along to the app. We wait until on-app-loading has been # called so that account-client-v2 has had a chance to load # any existing state so it can properly respond to this. if self._implicit_login_state_dirty and self._on_app_loading_called: diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index c784b9a5..67a86fe7 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -52,7 +52,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21583 +TARGET_BALLISTICA_BUILD = 21585 TARGET_BALLISTICA_VERSION = '1.7.28' diff --git a/src/assets/ba_data/python/bascenev1/_gameactivity.py b/src/assets/ba_data/python/bascenev1/_gameactivity.py index 7135b6d4..ad9bf0a5 100644 --- a/src/assets/ba_data/python/bascenev1/_gameactivity.py +++ b/src/assets/ba_data/python/bascenev1/_gameactivity.py @@ -438,10 +438,16 @@ class GameActivity(Activity[PlayerT, TeamT]): assert classic is not None continues_window = classic.continues_window + # Turning these off. I want to migrate towards monetization that + # feels less pay-to-win-ish. + allow_continues = False + plus = babase.app.plus try: - if plus is not None and plus.get_v1_account_misc_read_val( - 'enableContinues', False + if ( + plus is not None + and plus.get_v1_account_misc_read_val('enableContinues', False) + and allow_continues ): session = self.session diff --git a/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py b/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py index ce226cfb..47e8d2ef 100644 --- a/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py +++ b/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py @@ -9,6 +9,7 @@ import random import logging from typing import TYPE_CHECKING +from bacommon.login import LoginType import bascenev1 as bs import bauiv1 as bui @@ -59,29 +60,25 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ) ) - self._account_type = ( - plus.get_v1_account_type() - if plus.get_v1_account_state() == 'signed_in' - else None - ) - self._game_service_icon_color: Sequence[float] | None self._game_service_achievements_texture: bui.Texture | None self._game_service_leaderboards_texture: bui.Texture | None - if self._account_type == 'Game Center': + # Tie in to specific game services if they are active. + adapter = plus.accounts.login_adapters.get(LoginType.GPGS) + gpgs_active = adapter is not None and adapter.is_back_end_active() + adapter = plus.accounts.login_adapters.get(LoginType.GAME_CENTER) + game_center_active = ( + adapter is not None and adapter.is_back_end_active() + ) + + if game_center_active: self._game_service_icon_color = (1.0, 1.0, 1.0) icon = bui.gettexture('gameCenterIcon') self._game_service_achievements_texture = icon self._game_service_leaderboards_texture = icon self._account_has_achievements = True - elif self._account_type == 'Game Circle': - icon = bui.gettexture('gameCircleIcon') - self._game_service_icon_color = (1, 1, 1) - self._game_service_achievements_texture = icon - self._game_service_leaderboards_texture = icon - self._account_has_achievements = True - elif self._account_type == 'Google Play': + elif gpgs_active: self._game_service_icon_color = (0.8, 1.0, 0.6) self._game_service_achievements_texture = bui.gettexture( 'googlePlayAchievementsIcon' diff --git a/src/assets/ba_data/python/bauiv1/__init__.py b/src/assets/ba_data/python/bauiv1/__init__.py index 9ff875a9..fa97bb6f 100644 --- a/src/assets/ba_data/python/bauiv1/__init__.py +++ b/src/assets/ba_data/python/bauiv1/__init__.py @@ -65,6 +65,7 @@ from babase import ( Keyboard, lock_all_input, LoginAdapter, + LoginInfo, Lstr, native_review_request, native_review_request_supported, @@ -191,6 +192,7 @@ __all__ = [ 'Keyboard', 'lock_all_input', 'LoginAdapter', + 'LoginInfo', 'Lstr', 'Mesh', 'native_review_request', diff --git a/src/assets/ba_data/python/bauiv1lib/account/settings.py b/src/assets/ba_data/python/bauiv1lib/account/settings.py index 52d9a7e9..4e48873a 100644 --- a/src/assets/ba_data/python/bauiv1lib/account/settings.py +++ b/src/assets/ba_data/python/bauiv1lib/account/settings.py @@ -63,13 +63,6 @@ class AccountSettingsWindow(bui.Window): 1.0, bui.WeakCall(self._update), repeat=True ) - # Currently we can only reset achievements on game-center. - # v1_account_type: str | None - # if self._v1_signed_in: - # v1_account_type = plus.get_v1_account_type() - # else: - # v1_account_type = None - # self._can_reset_achievements = v1_account_type == 'Game Center' self._can_reset_achievements = False app = bui.app @@ -243,19 +236,13 @@ class AccountSettingsWindow(bui.Window): # We expose GPGS-specific functionality only if it is 'active' # (meaning the current GPGS player matches one of our account's # logins). - gpgs_adapter = plus.accounts.login_adapters.get(LoginType.GPGS) - is_gpgs = ( - False if gpgs_adapter is None else gpgs_adapter.is_back_end_active() - ) + adapter = plus.accounts.login_adapters.get(LoginType.GPGS) + gpgs_active = adapter is not None and adapter.is_back_end_active() # Ditto for Game Center. - game_center_adapter = plus.accounts.login_adapters.get( - LoginType.GAME_CENTER - ) - is_game_center = ( - False - if game_center_adapter is None - else game_center_adapter.is_back_end_active() + adapter = plus.accounts.login_adapters.get(LoginType.GAME_CENTER) + game_center_active = ( + adapter is not None and adapter.is_back_end_active() ) show_signed_in_as = self._v1_signed_in @@ -268,23 +255,26 @@ class AccountSettingsWindow(bui.Window): # through that account. via_space = 25.0 if show_signed_in_as and bui.app.plus is not None: - primary_account = bui.app.plus.accounts.primary - if primary_account is not None: - # Show Google Play Games account name if the current account - # has such a login attached. - lname = primary_account.logins.get(LoginType.GPGS) - if lname is not None: - icontxt = bui.charstr( - bui.SpecialChar.GOOGLE_PLAY_GAMES_LOGO - ) - via_lines.append(f'{icontxt}{lname}') - - # Show Game Center account name if the current account - # has such a login attached. - lname = primary_account.logins.get(LoginType.GAME_CENTER) - if lname is not None: - icontxt = bui.charstr(bui.SpecialChar.GAME_CENTER_LOGO) - via_lines.append(f'{icontxt}{lname}') + accounts = bui.app.plus.accounts + if accounts.primary is not None: + # For these login types, we show 'via' IF there is a + # login of that type attached to our account AND it is + # currently active (We don't want to show 'via Game + # Center' if we're signed out of Game Center or + # currently running on Steam, even if there is a Game + # Center login attached to our account). + for ltype, lchar in [ + (LoginType.GPGS, bui.SpecialChar.GOOGLE_PLAY_GAMES_LOGO), + (LoginType.GAME_CENTER, bui.SpecialChar.GAME_CENTER_LOGO), + ]: + linfo = accounts.primary.logins.get(ltype) + ladapter = accounts.login_adapters.get(ltype) + if ( + linfo is not None + and ladapter is not None + and ladapter.is_back_end_active() + ): + via_lines.append(f'{bui.charstr(lchar)}{linfo.name}') # TEMP TESTING if bool(False): @@ -326,9 +316,8 @@ class AccountSettingsWindow(bui.Window): sign_in_button_space = 70.0 deprecated_space = 60 - show_game_service_button = self._v1_signed_in and v1_account_type in [ - 'Game Center' - ] + # Game Center currently has a single UI for everything. + show_game_service_button = game_center_active game_service_button_space = 60.0 show_what_is_v2 = self._v1_signed_in and v1_account_type == 'V2' @@ -338,7 +327,7 @@ class AccountSettingsWindow(bui.Window): # Always show achievements except in the game-center case where # its unified UI covers them. - show_achievements_button = self._v1_signed_in and not is_game_center + show_achievements_button = self._v1_signed_in and not game_center_active achievements_button_space = 60.0 show_achievements_text = ( @@ -346,7 +335,7 @@ class AccountSettingsWindow(bui.Window): ) achievements_text_space = 27.0 - show_leaderboards_button = self._v1_signed_in and is_gpgs + show_leaderboards_button = self._v1_signed_in and gpgs_active leaderboards_button_space = 60.0 show_campaign_progress = self._v1_signed_in @@ -383,7 +372,6 @@ class AccountSettingsWindow(bui.Window): show_sign_out_button = self._v1_signed_in and v1_account_type in [ 'Local', - 'Google Play', 'V2', ] sign_out_button_space = 70.0 @@ -548,7 +536,7 @@ class AccountSettingsWindow(bui.Window): value='(${VIA}', subs=[('${VIA}', bui.Lstr(resource='viaText'))], ), - scale=0.6, + scale=0.5, color=(0.4, 0.6, 0.4, 0.5), flatness=1.0, shadow=0.0, @@ -560,7 +548,7 @@ class AccountSettingsWindow(bui.Window): position=(self._sub_width * 0.5 + swidth * 0.5 + 10, v), size=(0, 0), text=')', - scale=0.6, + scale=0.5, color=(0.4, 0.6, 0.4, 0.5), flatness=1.0, shadow=0.0, @@ -869,14 +857,15 @@ class AccountSettingsWindow(bui.Window): # the button to go to OS-Specific leaderboards/high-score-lists/etc. if show_game_service_button: button_width = 300 - v -= game_service_button_space * 0.85 - v1_account_type = plus.get_v1_account_type() - if v1_account_type == 'Game Center': + v -= game_service_button_space * 0.6 + if game_center_active: # Update: Apparently Game Center is just called 'Game Center' # in all languages. Can revisit if not true. # https://developer.apple.com/forums/thread/725779 - v1_account_type_name = bui.Lstr(value='Game Center') - # v1_account_type_name = bui.Lstr(resource='gameCenterText') + game_service_button_label = bui.Lstr( + value=bui.charstr(bui.SpecialChar.GAME_CENTER_LOGO) + + 'Game Center' + ) else: raise ValueError( "unknown account type: '" + str(v1_account_type) + "'" @@ -889,7 +878,7 @@ class AccountSettingsWindow(bui.Window): autoselect=True, on_activate_call=self._on_game_service_button_press, size=(button_width, 50), - label=v1_account_type_name, + label=game_service_button_label, ) if first_selectable is None: first_selectable = btn @@ -899,7 +888,7 @@ class AccountSettingsWindow(bui.Window): right_widget=bui.get_special_widget('party_button'), ) bui.widget(edit=btn, left_widget=bbtn) - v -= game_service_button_space * 0.15 + v -= game_service_button_space * 0.4 else: self.game_service_button = None @@ -932,13 +921,15 @@ class AccountSettingsWindow(bui.Window): autoselect=True, icon=bui.gettexture( 'googlePlayAchievementsIcon' - if is_gpgs + if gpgs_active else 'achievementsIcon' ), - icon_color=(0.8, 0.95, 0.7) if is_gpgs else (0.85, 0.8, 0.9), + icon_color=(0.8, 0.95, 0.7) + if gpgs_active + else (0.85, 0.8, 0.9), on_activate_call=( self._on_custom_achievements_press - if is_gpgs + if gpgs_active else self._on_achievements_press ), size=(button_width, 50), diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 40022420..8a54713b 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -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 = 21583; +const int kEngineBuildNumber = 21585; const char* kEngineVersion = "1.7.28"; const int kEngineApiVersion = 8; diff --git a/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc b/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc index 8b1c6811..f50fb4ba 100644 --- a/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc +++ b/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc @@ -2341,39 +2341,6 @@ static PyMethodDef PyUIBoundsDef = { "center remains onscreen.", }; -// ----------------------------- focus_window ---------------------------------- - -static auto PyFocusWindow(PyObject* self, PyObject* args, PyObject* keywds) - -> PyObject* { - BA_PYTHON_TRY; - - static const char* kwlist[] = {nullptr}; - if (!PyArg_ParseTupleAndKeywords(args, keywds, "", - const_cast(kwlist))) { - return nullptr; - } - assert(g_base->InLogicThread()); - // #if BA_OSTYPE_MACOS && BA_XCODE_BUILD && !BA_HEADLESS_BUILD \ -// && !BA_XCODE_NEW_PROJECT - // SDL_ericf_focus(); - // #else - // #endif - Py_RETURN_NONE; - BA_PYTHON_CATCH; -} - -static PyMethodDef PyFocusWindowDef = { - "focus_window", // name - (PyCFunction)PyFocusWindow, // method - METH_VARARGS | METH_KEYWORDS, // flags - - "focus_window() -> None\n" - "\n" - "(internal)\n" - "\n" - "A workaround for some unintentional backgrounding that occurs on mac", -}; - // ------------------------ show_online_score_ui ------------------------------- static auto PyShowOnlineScoreUI(PyObject* self, PyObject* args, @@ -2880,7 +2847,6 @@ auto PythonMethodsUIV1::GetMethods() -> std::vector { PyShowAdDef, PyShowAd2Def, PyShowOnlineScoreUIDef, - PyFocusWindowDef, PyButtonWidgetDef, PyCheckBoxWidgetDef, PyImageWidgetDef, diff --git a/tools/batools/build.py b/tools/batools/build.py index 004ab926..e9bd8b2d 100644 --- a/tools/batools/build.py +++ b/tools/batools/build.py @@ -43,8 +43,8 @@ class PyRequirement: # remove our custom module based stuff soon if nobody complains, which # would free us to theoretically move to a requirements.txt based setup. PY_REQUIREMENTS = [ + PyRequirement(pipname='mypy', minversion=[1, 7, 0]), PyRequirement(pipname='pylint', minversion=[3, 0, 2]), - PyRequirement(pipname='mypy', minversion=[1, 6, 1]), PyRequirement(pipname='cpplint', minversion=[1, 6, 1]), PyRequirement(pipname='pytest', minversion=[7, 4, 2]), PyRequirement(pipname='pytz', minversion=[2023, 3]),