diff --git a/.efrocachemap b/.efrocachemap index 2e6f6764..3ce18d80 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -421,9 +421,9 @@ "build/assets/ba_data/audio/zoeOw.ogg": "b2d705c31c9dcc1efdc71394764c3beb", "build/assets/ba_data/audio/zoePickup01.ogg": "e9366dc2d2b8ab8b0c4e2c14c02d0789", "build/assets/ba_data/audio/zoeScream01.ogg": "903e0e45ee9b3373e9d9ce20c814374e", - "build/assets/ba_data/data/langdata.json": "03810e5cca79c5fa092f47648060ca0f", + "build/assets/ba_data/data/langdata.json": "7db4a04756081874702adcd3b295d9e8", "build/assets/ba_data/data/languages/arabic.json": "8f89f09ad168c251765efebde4c9069c", - "build/assets/ba_data/data/languages/belarussian.json": "1004e5ea10b8deaef517fd37e9309521", + "build/assets/ba_data/data/languages/belarussian.json": "0b60a9d4496d1213c2d0b647d346ce30", "build/assets/ba_data/data/languages/chinese.json": "3a8ad6b99e13152872962019b3eef49d", "build/assets/ba_data/data/languages/chinesetraditional.json": "904b35b656c53f9830e406565edd5120", "build/assets/ba_data/data/languages/croatian.json": "1e541070309ff6be95b0c39940aa7e99", @@ -440,22 +440,22 @@ "build/assets/ba_data/data/languages/hindi.json": "567e6976b3c72f891431ad7fcc62ab16", "build/assets/ba_data/data/languages/hungarian.json": "9d88004a98f0fbe2ea72edd5e0b3002e", "build/assets/ba_data/data/languages/indonesian.json": "2ccb3fe081ead7706dbebb1008a8bc4e", - "build/assets/ba_data/data/languages/italian.json": "43735ea42d14c121bc14eace16f904a2", + "build/assets/ba_data/data/languages/italian.json": "eabad2faba952c426876bc07e1490d09", "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": "2584895475fe62b3fe49a5ea5e69b4b1", - "build/assets/ba_data/data/languages/piratespeak.json": "b9fe871e6331b7178cbacbf7eb3033aa", + "build/assets/ba_data/data/languages/piratespeak.json": "7c7e3b72b87c1bcd5b04c9f64d912f0c", "build/assets/ba_data/data/languages/polish.json": "d0822d5d3bdd72ddb04dc3c43a0b1395", - "build/assets/ba_data/data/languages/portuguese.json": "46649f4a8f3c5f69758e8b75ffacf439", + "build/assets/ba_data/data/languages/portuguese.json": "b4463a05d65515f6812e1177c60ac666", "build/assets/ba_data/data/languages/romanian.json": "5ae206fe0b71c4015b02b86da8931c8f", - "build/assets/ba_data/data/languages/russian.json": "72bdbb27ede61bbfeafbf81fa4a19e45", + "build/assets/ba_data/data/languages/russian.json": "fc64ed6b6356ea11385ee5c20748425a", "build/assets/ba_data/data/languages/serbian.json": "623fa4129a1154c2f32ed7867e56ff6a", "build/assets/ba_data/data/languages/slovak.json": "3c08c748c96c71bd9e1d7291fb8817b6", - "build/assets/ba_data/data/languages/spanish.json": "13f587058931acbb68a48981063ee5ff", + "build/assets/ba_data/data/languages/spanish.json": "499b464318a8c9d1fb271cf480862b57", "build/assets/ba_data/data/languages/swedish.json": "3b179e7333183c70adb0811246b09959", "build/assets/ba_data/data/languages/tamil.json": "ead39b864228696a9b0d19344bc4b5ec", "build/assets/ba_data/data/languages/thai.json": "383540a1e9c7c131ac579f51afc87471", - "build/assets/ba_data/data/languages/turkish.json": "440cb59e69ed689018c17d4be0fb4696", + "build/assets/ba_data/data/languages/turkish.json": "ccec3224e41bee03f798d9c1a7d23342", "build/assets/ba_data/data/languages/ukrainian.json": "6063d27c9d6ed013b2b64ff452433621", "build/assets/ba_data/data/languages/venetian.json": "abebcc38ca2655578e65428cc0dd3c45", "build/assets/ba_data/data/languages/vietnamese.json": "59f6686890ceac2b0ac92597751a18ca", @@ -4103,42 +4103,42 @@ "build/assets/windows/Win32/ucrtbased.dll": "bfd1180c269d3950b76f35a63655e9e1", "build/assets/windows/Win32/vc_redist.x86.exe": "15a5f1f876503885adbdf5b3989b3718", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "350b2bde93ebd0b898af75e7c537593e", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "aa93eac2ca5e2b585bc58007a9a7374d", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "195d8e78d9598bd94d6912de4c7c08f1", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "e5f9cd858fb8b699fd79fe75a54acdcb", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "5455d6b73d70b60390f2455cd145f6fd", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "b2eda8f3cb29e99157e47852aad17930", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "eb3cc9dc20632ce84d1b2cd4d3072ea8", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "b3f2fce44e5552093825190b763826a8", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "20b8de1495c2d82e079e6ea1ea720888", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "a624bd02b74589a097aa265e7c42fc10", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "25630bca72b77a6dc56013ee0e8367a3", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "030e2ee45f19c69770e079d48a474b7c", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "ee59e9bf36b46e574f33a3826430b5d2", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "70ce8264ec98aa3de411838c6aaa329b", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "68bd3725e087fac142979f9f5c1d0dc3", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "c69217389ecaf461af3b9a25a9ddb7c0", - "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "678f8cbc0a31cf59f86211804f3d18f3", - "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "658a1267cf8454e74dd7a43d4921a862", - "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "678f8cbc0a31cf59f86211804f3d18f3", - "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "658a1267cf8454e74dd7a43d4921a862", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "5dfc9ffb40df78765dee25eed63b4d30", - "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "9c65f68f604202158a6c7486eeb985a9", - "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "5dfc9ffb40df78765dee25eed63b4d30", - "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "9c65f68f604202158a6c7486eeb985a9", - "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "4e5e0cac71feae718dfcccdeaa03eba1", - "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "c54e70ec873ecab76c655c20e13f595e", - "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "4e5e0cac71feae718dfcccdeaa03eba1", - "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "c54e70ec873ecab76c655c20e13f595e", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "07b2fb0516fce4cce2bd1be0ec4a72ba", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "af473b4892a9e38c0e7a377534002639", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "0197ca506582361947be75ee7d3872cd", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "bf721fa759cc404b78b12467ece5158c", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "469d1e980701c71ff59e027ed3bf194e", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "616ac71908f70c7073007cc6be0097bf", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "587ce43506de3fb122481b9fba5a29e8", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "e733a9814771f96448c055071fefec20", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "6a6b5a81a0398637ab032501ebef45e0", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "e25e7120708abad6a26c202e3f43f2a1", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "38c6cd9d1fda895d5438a127cc4025df", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "58391fd251fa3698fd60e49f8ffab8dd", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "de106a0d319b579487b3f49d9a839de0", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "e02ae01dc7922b1324a506805aade940", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "dfffbd298de9818511e85a92b9b896f2", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "b778c94e161a86c69c9d9279a33f99e2", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "e16970fb9f8cf72e74a957126feff8f2", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "081674ba8c39a729d0ca0cdd4e18e7c5", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "05690b982897eab49ca81b44ccf128a9", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "66622ba04928e7c27a2fc56188fa199d", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "b4719f8a13595a66c706597c7f8d5af4", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "2c946e8429e6e30c31ff233ff12e40ba", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "05f5752ee8889cda4c084b5475872aea", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "81a6e9ea469430c4d3e960d998e80f93", + "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "70370c724e34f5e84c2af6ea3a5c70a4", + "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "59bd83efb949ff66e8845ee1b6f04deb", + "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "70370c724e34f5e84c2af6ea3a5c70a4", + "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "59bd83efb949ff66e8845ee1b6f04deb", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "a102df2262d65b3e7368be2092c39032", + "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "bd88ede126790cb71c571817ba97a055", + "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "a102df2262d65b3e7368be2092c39032", + "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "bd88ede126790cb71c571817ba97a055", + "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "82c4761b385f40fbb78c4538ce22356f", + "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "48c26b5899970ceaeaa09d47de7537dc", + "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "82c4761b385f40fbb78c4538ce22356f", + "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "48c26b5899970ceaeaa09d47de7537dc", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "f911b4274de1beffbd32edbcb66ebff8", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "0e4e1340b2dbe074546d3831af9d115a", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "7f67b5ed4ce5c72103f0eb920597e8c9", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "9c706ceda2432513ecb3bb14b57ccab8", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "e95a15ac3ed57d1177a2a877feb7de15", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "77453446385b7a35a7e9b16f42009616", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "e4d1fb62b0a0a67e92c7a20461acd18d", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "956281fe24cdd7c420440c47334f3bf9", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "794d258d59fd17a61752843a9a0551ad", "src/ballistica/base/mgen/pyembed/binding_base.inc": "06042d31df0ff9af96b99477162e2a91", diff --git a/CHANGELOG.md b/CHANGELOG.md index cea15b11..98b6676e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.37 (build 22130, api 9, 2024-12-06) +### 1.7.37 (build 22133, api 9, 2024-12-12) - Bumping api version to 9. As you'll see below, there's some UI changes that will require a bit of work for any UI mods to adapt to. If your mods don't touch UI stuff at all you can simply bump your api version and call it a day. diff --git a/config/requirements.txt b/config/requirements.txt index ed4214ed..c84a2d0c 100644 --- a/config/requirements.txt +++ b/config/requirements.txt @@ -5,7 +5,7 @@ furo==2024.8.6 mypy==1.13.0 pbxproj==4.2.1 pdoc==15.0.0 -pur==7.3.2 +pur==7.3.3 pylint==3.3.2 pylsp-mypy==0.6.9 pytest==8.3.4 diff --git a/src/assets/ba_data/python/babase/_net.py b/src/assets/ba_data/python/babase/_net.py index 93522adf..f871a4f3 100644 --- a/src/assets/ba_data/python/babase/_net.py +++ b/src/assets/ba_data/python/babase/_net.py @@ -33,7 +33,7 @@ class NetworkSubsystem: # that a nearby server has been pinged. self.zone_pings: dict[str, float] = {} - # For debugging. + # For debugging/progress. self.v1_test_log: str = '' self.v1_ctest_results: dict[int, str] = {} self.connectivity_state = 'uninited' diff --git a/src/assets/ba_data/python/baclassic/_appmode.py b/src/assets/ba_data/python/baclassic/_appmode.py index 5d94a6c4..ea89e720 100644 --- a/src/assets/ba_data/python/baclassic/_appmode.py +++ b/src/assets/ba_data/python/baclassic/_appmode.py @@ -202,8 +202,9 @@ class ClassicAppMode(babase.AppMode): print(f'GOT SUB TEST UPDATE: {val}') def _on_classic_account_data_change( - self, val: bacommon.cloud.ClassicAccountLiveData + self, val: bacommon.cloud.BSClassicAccountLiveData ) -> None: + # print('ACCOUNT CHANGED', val) achp = round(val.achievements / max(val.achievements_total, 1) * 100.0) ibc = str(val.inbox_count) if val.inbox_count_is_max: diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index fc0ebad6..efba3400 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -53,7 +53,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 22130 +TARGET_BALLISTICA_BUILD = 22133 TARGET_BALLISTICA_VERSION = '1.7.37' diff --git a/src/assets/ba_data/python/baplus/_cloud.py b/src/assets/ba_data/python/baplus/_cloud.py index 22d85823..0d992c24 100644 --- a/src/assets/ba_data/python/baplus/_cloud.py +++ b/src/assets/ba_data/python/baplus/_cloud.py @@ -202,7 +202,7 @@ class CloudSubsystem(babase.AppSubsystem): def subscribe_classic_account_data( self, - updatecall: Callable[[bacommon.cloud.ClassicAccountLiveData], None], + updatecall: Callable[[bacommon.cloud.BSClassicAccountLiveData], None], ) -> babase.CloudSubscription: """Subscribe to classic account data.""" raise NotImplementedError( diff --git a/src/assets/ba_data/python/bauiv1lib/account/settings.py b/src/assets/ba_data/python/bauiv1lib/account/settings.py index 928ebf5f..bbe57090 100644 --- a/src/assets/ba_data/python/bauiv1lib/account/settings.py +++ b/src/assets/ba_data/python/bauiv1lib/account/settings.py @@ -369,7 +369,15 @@ class AccountSettingsWindow(bui.MainWindow): show_manage_account_button = primary_v2_account is not None manage_account_button_space = 70.0 - show_delete_account_button = primary_v2_account is not None + # Apple asks us to make a delete-account button directly + # available in the UI. Currently disabling this elsewhere + # however as I feel that poking 'Manage Account' and scrolling + # down to 'Delete Account' is not hard to find. + show_delete_account_button = primary_v2_account is not None and ( + bui.app.classic is not None + and bui.app.classic.platform == 'mac' + and bui.app.classic.subplatform == 'appstore' + ) delete_account_button_space = 70.0 show_link_accounts_button = self._v1_signed_in and ( diff --git a/src/assets/ba_data/python/bauiv1lib/connectivity.py b/src/assets/ba_data/python/bauiv1lib/connectivity.py index 41062f84..8f76fc62 100644 --- a/src/assets/ba_data/python/bauiv1lib/connectivity.py +++ b/src/assets/ba_data/python/bauiv1lib/connectivity.py @@ -4,7 +4,6 @@ from __future__ import annotations -import time from typing import TYPE_CHECKING import bauiv1 as bui @@ -49,12 +48,6 @@ class WaitForConnectivityWindow(bui.Window): self._on_cancel = on_cancel self._width = 650 self._height = 300 - self._infos: list[str | bui.Lstr] = [ - 'This can take a few moments, especially on first launch.', - 'Make sure your internet connection is working.', - ] - self._last_info_switch_time = time.monotonic() - self._info_index = 0 super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), @@ -69,21 +62,23 @@ class WaitForConnectivityWindow(bui.Window): scale=1.2, h_align='center', v_align='center', - text='Locating nearest regional servers...', + text=bui.Lstr(resource='internal.connectingToPartyText'), maxwidth=self._width * 0.9, ) self._info_text = bui.textwidget( parent=self._root_widget, position=(self._width * 0.5, self._height * 0.45), size=(0, 0), - color=(0.7, 0.6, 0.7), + color=(0.6, 0.5, 0.6), flatness=1.0, - scale=0.8, + shadow=0.0, + scale=0.75, h_align='center', v_align='center', - text=self._infos[0], + text='', maxwidth=self._width * 0.9, ) + self._info_text_str = '' cancel_button = bui.buttonwidget( parent=self._root_widget, autoselect=True, @@ -98,7 +93,6 @@ class WaitForConnectivityWindow(bui.Window): ) def _update(self) -> None: - now = time.monotonic() plus = bui.app.plus assert plus is not None @@ -107,12 +101,16 @@ class WaitForConnectivityWindow(bui.Window): self._connected() return - if now - self._last_info_switch_time > 5.0: - self._info_index = (self._info_index + 1) % len(self._infos) - bui.textwidget( - edit=self._info_text, text=self._infos[self._info_index] - ) - self._last_info_switch_time = now + # Show what connectivity is up to if we don't have any published + # zone-pings yet (or if we do but there's no transport state to + # show yet). + if not bui.app.net.zone_pings or not bui.app.net.transport_state: + infotext = bui.app.net.connectivity_state + else: + infotext = bui.app.net.transport_state + if infotext != self._info_text_str: + self._info_text_str = infotext + bui.textwidget(edit=self._info_text, text=infotext) def _connected(self) -> None: if not self._root_widget or self._root_widget.transitioning_out: diff --git a/src/assets/ba_data/python/bauiv1lib/inbox.py b/src/assets/ba_data/python/bauiv1lib/inbox.py index 4a0ae6fe..f350cd19 100644 --- a/src/assets/ba_data/python/bauiv1lib/inbox.py +++ b/src/assets/ba_data/python/bauiv1lib/inbox.py @@ -36,16 +36,12 @@ class _MessageEntry: class InboxWindow(bui.MainWindow): """Popup window to show account messages.""" - def __del__(self) -> None: - print('~InboxWindow()') - def __init__( self, transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, ): - print('InboxWindow()') assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale @@ -63,9 +59,7 @@ class InboxWindow(bui.MainWindow): root_widget=bui.containerwidget( size=(self._width, self._height), toolbar_visibility=( - 'menu_minimal' - if uiscale is bui.UIScale.SMALL - else 'menu_full' + 'menu_full' if uiscale is bui.UIScale.SMALL else 'menu_full' ), scale=( 2.3 @@ -119,15 +113,29 @@ class InboxWindow(bui.MainWindow): color=bui.app.ui_v1.title_color, ) + # Shows 'loading', 'no messages', etc. + self._infotext = bui.textwidget( + parent=self._root_widget, + position=(self._width * 0.5, self._height * 0.5), + maxwidth=self._width * 0.7, + scale=0.5, + flatness=1.0, + color=(0.4, 0.4, 0.5), + shadow=0.0, + text=bui.Lstr(resource='loadingText'), + size=(0, 0), + h_align='center', + v_align='center', + ) self._scrollwidget = bui.scrollwidget( parent=self._root_widget, size=( self._width - 60, - self._height - (150 if uiscale is bui.UIScale.SMALL else 70), + self._height - (170 if uiscale is bui.UIScale.SMALL else 70), ), position=( 30, - (110 if uiscale is bui.UIScale.SMALL else 30) + yoffs, + (133 if uiscale is bui.UIScale.SMALL else 30) + yoffs, ), capture_arrows=True, simple_culling_v=200, @@ -172,17 +180,9 @@ class InboxWindow(bui.MainWindow): def _error(self, errmsg: bui.Lstr | str) -> None: """Put ourself in a permanent error state.""" bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height * 0.5), - maxwidth=self._width * 0.7, - scale=1.0, - flatness=1.0, + edit=self._infotext, color=(1, 0, 0), - shadow=0.0, text=errmsg, - size=(0, 0), - h_align='center', - v_align='center', ) def _on_message_entry_press( @@ -315,7 +315,21 @@ class InboxWindow(bui.MainWindow): # Whee; no error. Mark as done. if button is not None: - bui.buttonwidget(edit=button, label=bui.Lstr(resource='doneText')) + # For positive claim buttons, say 'success'. + # Otherwise default to 'done.' + if ( + entry.type + in { + bacommon.cloud.BSInboxEntryType.CLAIM, + bacommon.cloud.BSInboxEntryType.CLAIM_DISCARD, + } + and process_type + is bacommon.cloud.BSInboxEntryProcessType.POSITIVE + ): + label = bui.Lstr(resource='successText') + else: + label = bui.Lstr(resource='doneText') + bui.buttonwidget(edit=button, label=label) def _on_inbox_request_response( self, response: bacommon.cloud.BSInboxRequestResponse | Exception @@ -350,20 +364,14 @@ class InboxWindow(bui.MainWindow): # keyboard control working in the empty case. if not response.entries: bui.textwidget( - parent=self._root_widget, - position=(self._width * 0.5, self._height * 0.5), - maxwidth=self._width * 0.7, - scale=1.0, - flatness=1.0, - color=(0.4, 0.4, 0.4), - shadow=0.0, + edit=self._infotext, + color=(0.4, 0.4, 0.5), text=bui.Lstr(resource='noMessagesText'), - size=(0, 0), - h_align='center', - v_align='center', ) return + bui.textwidget(edit=self._infotext, text='') + sub_width = self._width - 90 sub_height = 0.0 diff --git a/src/ballistica/base/platform/base_platform.cc b/src/ballistica/base/platform/base_platform.cc index f5326973..716da8f1 100644 --- a/src/ballistica/base/platform/base_platform.cc +++ b/src/ballistica/base/platform/base_platform.cc @@ -66,8 +66,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__ 2024 6 13 - auto rand_uuid_component{"1URRE62C7234VP9L1BUPJ1P7QT7Q8YW3"}; + // __last_rand_uuid_component_shuffle_date__ 2024 12 11 + auto rand_uuid_component{"ACIMGEQUN3F6CIUMFYO3X6GYLPTTSPOZ"}; inputs.emplace_back(rand_uuid_component); auto gil{Python::ScopedInterpreterLock()}; diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 79533b02..3a34c32a 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 = 22130; +const int kEngineBuildNumber = 22133; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 9; diff --git a/src/ballistica/ui_v1/widget/root_widget.cc b/src/ballistica/ui_v1/widget/root_widget.cc index bac662c8..5e2b7920 100644 --- a/src/ballistica/ui_v1/widget/root_widget.cc +++ b/src/ballistica/ui_v1/widget/root_widget.cc @@ -18,11 +18,12 @@ namespace ballistica::ui_v1 { -#define TOOLBAR_OPACITY_2 1.0f +static const float kBotLeftColorR{0.6f}; +static const float kBotLeftColorG{0.6f}; +static const float kBotLeftColorB{0.8f}; -#define BOT_LEFT_COLOR_R 0.6 -#define BOT_LEFT_COLOR_G 0.6 -#define BOT_LEFT_COLOR_B 0.8 +// Flip this to true when we're ready to use levels. +static const bool kShowLevels{false}; // For defining toolbar buttons. struct RootWidget::ButtonDef { @@ -166,24 +167,30 @@ void RootWidget::AddMeter_(MeterType type, float h_align, float r, float g, bd.color_b = 0.5f; bd.depth_min = 0.3f; - bd.visibility_mask = - (static_cast(Widget::ToolbarVisibility::kMenuFull) - | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) - | static_cast(Widget::ToolbarVisibility::kMenuFullRoot)); - bd.allow_in_game = false; + if (type == MeterType::kLevel && !kShowLevels) { + // Keep levels hidden always. + } else { + bd.visibility_mask = + (static_cast(Widget::ToolbarVisibility::kMenuFull) + | static_cast(Widget::ToolbarVisibility::kMenuFullNoBack) + | static_cast(Widget::ToolbarVisibility::kMenuFullRoot)); - // Show some in store mode. - if (type == MeterType::kLevel || type == MeterType::kTickets) { - bd.visibility_mask |= - static_cast(Widget::ToolbarVisibility::kMenuStore) - | static_cast(Widget::ToolbarVisibility::kMenuStoreNoBack); - } - // Show some in get-tokens/tokens mode - if (type == MeterType::kTokens) { - bd.visibility_mask |= - static_cast(Widget::ToolbarVisibility::kGetTokens) - | static_cast(Widget::ToolbarVisibility::kMenuTokens); + bd.allow_in_game = false; + + // Show some in store mode. + if (type == MeterType::kLevel || type == MeterType::kTickets) { + bd.visibility_mask |= + static_cast(Widget::ToolbarVisibility::kMenuStore) + | static_cast( + Widget::ToolbarVisibility::kMenuStoreNoBack); + } + // Show some in get-tokens/tokens mode + if (type == MeterType::kTokens) { + bd.visibility_mask |= + static_cast(Widget::ToolbarVisibility::kGetTokens) + | static_cast(Widget::ToolbarVisibility::kMenuTokens); + } } // Adjust buffer between neighbors. @@ -531,7 +538,7 @@ void RootWidget::Setup() { AddMeter_(MeterType::kLevel, 0.0f, 1.0f, 1.0f, 1.0f, false, ""); AddMeter_(MeterType::kTrophy, 0.0f, 1.0f, 1.0f, 1.0f, false, ""); - // Menu button (only shows up when we're not in a menu) + // Menu button (only shows up when we're not in a menu). // FIXME - this should never be visible on TV or VR UI modes { ButtonDef b; @@ -618,9 +625,9 @@ void RootWidget::Setup() { b.width = b.height = 60.0f; // b.x = bx; b.y = b.height * 0.5f + 2.0f; - b.color_r = BOT_LEFT_COLOR_R; - b.color_g = BOT_LEFT_COLOR_G; - b.color_b = BOT_LEFT_COLOR_B; + b.color_r = kBotLeftColorR; + b.color_g = kBotLeftColorG; + b.color_b = kBotLeftColorB; b.img = "logIcon"; b.call = UIV1Python::ObjID::kRootUIInboxButtonPressCall; b.visibility_mask = @@ -675,9 +682,9 @@ void RootWidget::Setup() { b.v_align = VAlign::kBottom; b.width = b.height = 60.0f; b.y = b.height * 0.5f + 2.0f; - b.color_r = BOT_LEFT_COLOR_R; - b.color_g = BOT_LEFT_COLOR_G; - b.color_b = BOT_LEFT_COLOR_B; + b.color_r = kBotLeftColorR; + b.color_g = kBotLeftColorG; + b.color_b = kBotLeftColorB; b.img = "achievementsIcon"; b.call = UIV1Python::ObjID::kRootUIAchievementsButtonPressCall; b.visibility_mask = @@ -717,9 +724,9 @@ void RootWidget::Setup() { b.width = b.height = 60.0f; // b.x = bx; b.y = b.height * 0.5f + 2.0f; - b.color_r = BOT_LEFT_COLOR_R; - b.color_g = BOT_LEFT_COLOR_G; - b.color_b = BOT_LEFT_COLOR_B; + b.color_r = kBotLeftColorR; + b.color_g = kBotLeftColorG; + b.color_b = kBotLeftColorB; b.img = "leaderboardsIcon"; b.visibility_mask = (static_cast(Widget::ToolbarVisibility::kMenuFull) @@ -737,9 +744,9 @@ void RootWidget::Setup() { b.width = b.height = 60.0f; // b.x = bx; b.y = b.height * 0.58f - 2.0f; - b.color_r = BOT_LEFT_COLOR_R; - b.color_g = BOT_LEFT_COLOR_G; - b.color_b = BOT_LEFT_COLOR_B; + b.color_r = kBotLeftColorR; + b.color_g = kBotLeftColorG; + b.color_b = kBotLeftColorB; b.img = "settingsIcon"; b.call = UIV1Python::ObjID::kRootUISettingsButtonPressCall; b.visibility_mask = @@ -1023,9 +1030,9 @@ void RootWidget::UpdateForFocusedWindow_(Widget* widget) { } void RootWidget::StepChildWidgets_(float dt) { - // Hitches tend to break our math and cause buttons to overshoot on - // their transitions in and then back up. So let's limit our max dt - // to about what ~30fps would give us. + // Hitches tend to break our math and cause buttons to overshoot on their + // transitions in and then back up. So let's limit our max dt to about + // what ~30fps would give us. dt = std::min(dt, 1000.0f / 30.0f); if (!child_widgets_dirty_) { diff --git a/tools/bacommon/cloud.py b/tools/bacommon/cloud.py index 79bcfcec..04041321 100644 --- a/tools/bacommon/cloud.py +++ b/tools/bacommon/cloud.py @@ -327,11 +327,29 @@ class BSPrivatePartyResponse(Response): datacode: Annotated[str | None, IOAttrs('d')] +class BSClassicChestAppearance(Enum): + """Appearances bombsquad classic chests can have.""" + + UNKNOWN = 'u' + DEFAULT = 'd' + + @ioprepped @dataclass -class ClassicAccountLiveData: +class BSClassicAccountLiveData: """Account related data kept up to date live for classic app mode.""" + @dataclass + class Chest: + """A lovely chest.""" + + appearance: Annotated[ + BSClassicChestAppearance, + IOAttrs('a', enum_fallback=BSClassicChestAppearance.UNKNOWN), + ] + unlock_time: Annotated[datetime.datetime, IOAttrs('t')] + ad_unlock_time: Annotated[datetime.datetime | None, IOAttrs('at')] + class LeagueType(Enum): """Type of league we are in.""" @@ -359,6 +377,8 @@ class ClassicAccountLiveData: inbox_count: Annotated[int, IOAttrs('ibc')] inbox_count_is_max: Annotated[bool, IOAttrs('ibcm')] + chests: Annotated[dict[str, Chest], IOAttrs('c')] + class BSInboxEntryType(Enum): """Types of entries that can be in an inbox."""