diff --git a/.efrocachemap b/.efrocachemap index 9b48d154..fba194c7 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -4096,50 +4096,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": "5dc626488240419a7fccd2e11e4e4fdc", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "9ee005e3df40528efc090d879917bec2", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "d554d33e3923e544b9b31dcc261230fb", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "764db7c11f7448c2c1dde96d7ec799b5", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "dd6fe4f7cc89a93a50a9693587bf511a", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "cf203b66bb7bd718dbcb43c19d2c45bd", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "317ec48fe589393847a7b0c0a6d602d1", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "59dd77ef407875ff7af0628e05a45ae7", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "c3f17815f34c6947eda16fdb850ed64c", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "6169a8b0c55aec2aa8e2ebd618d379a2", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "a1596b9b8425ab0a8531c7f1f4acf3b8", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "e674b261174e9b06a34f90c626856aa6", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "d14b5f0693440239fd056d831441a53a", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "3584cd1db78d6b68c8436eaa86bc6d21", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "b7242358f3d1bb04a414e4b7dfbc4311", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "11fe178ab9c93eb0f5d32a27895ea811", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "413f092eb584ba15edc1a1b48a63d760", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "35b37b4a67815a91df7b77ea2fac9f26", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "102b5af73a4ebce8ac475ed960ead4b4", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "f46a78e101f8c2c73654dfc982295748", - "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "0b5f8bdbe8221c4642d9f7f8584645ce", - "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "e94dd06863796f17b9cfcbb5f79edd32", - "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "0b5f8bdbe8221c4642d9f7f8584645ce", - "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "e94dd06863796f17b9cfcbb5f79edd32", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "0248b884a4670bd63fc68faeb93db160", - "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "2a5be1c7afca637bab7638d938d1b5b4", - "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "0248b884a4670bd63fc68faeb93db160", - "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "2a5be1c7afca637bab7638d938d1b5b4", - "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "1f25c914affb8b1944a6eb10b4db2947", - "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "b7cc7b32cc752d76d01d802977bd7abb", - "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "1f25c914affb8b1944a6eb10b4db2947", - "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "b7cc7b32cc752d76d01d802977bd7abb", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "cc0bf2777f9e63f2917cf43a9f522876", - "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "381953df0ba482ef485e4da3fd8e9e69", - "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "3b706f71d9a4fd3e5e5ecae88c6087ee", - "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "381953df0ba482ef485e4da3fd8e9e69", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "1706a7dc691b033e20d3861e9b16861d", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "259cbea25d8aa9d53e61f2f1c7af2ff6", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "fd51dd1b9a75c053ba91ed521fd72fe1", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "3bb33d27b717ab731f43f44c443d1504", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "930c75164e229b2f9e3aa042100b1911", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "329d5a560c7dd3a9bef54ec9db9aaf27", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "51175094ecad6e8bea39103bb927e449", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "abf57a7d6c2df8bc3829060039bf7c19", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "0b91292430d8deb60fea29ea3cbd08c4", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "5de7507d5eecd943a259306e4a88e31f", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b784c5218097a3cc9cb1fb128252745f", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "fe567c99090f94f169a09a8a49f072c6", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "a1718fa31093008d7e06df5437ad094e", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "8b8a7d3a484d4bca1946d479be3dfa0b", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "f55dda6ac5c57e950fd6caca43723e04", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "d7cf60f2dd71b8ea6e44e86384897542", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "34bffdb7d43d4a918f03d7adc3185572", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "e1eaf4393ae32874fc7ed09eb9e87071", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "76fb2324412f05f62d6664c0fbaaa6ff", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "45fdd4c09007e601a74e8be5705c64f5", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "36dcd45c4503216ab4c213ed92386c31", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "bf22c964c56cd8593c17504ab19ec152", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "da9177bfef989af57ce047267e7fdf23", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "f5fd6eada12cf3de3735b80d6a707240", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "60fd3eb460320f3246001ba9b57b0c65", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "7bdf4ca50de9ff62bc6cbd86a07ca68d", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "daa2b20a69b554f619de0b1e3f8083fc", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "facbfecf157677de9756cc02833fbaea", + "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "f731b23639b0b152109c3a367ab19340", + "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "af1fa785407814fb7cab31dc95b6246d", + "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "f731b23639b0b152109c3a367ab19340", + "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "af1fa785407814fb7cab31dc95b6246d", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "1eff75bbcdce0ff611678ce79ba0ac18", + "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "af504ed9b0990fdbc5441b40f925890a", + "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "1eff75bbcdce0ff611678ce79ba0ac18", + "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "af504ed9b0990fdbc5441b40f925890a", + "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "2c88978e61c4a37606c4964ab0e62561", + "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "0422ad13cbb5234fecfc14f7573ba020", + "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "2c88978e61c4a37606c4964ab0e62561", + "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "0422ad13cbb5234fecfc14f7573ba020", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticaplus.a": "412efbbf3d7d9c85398c43303b03466e", + "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "82b3e97e5f7620294eede876424e0c75", + "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "dc201ad653d7098266caa12bcd038c30", + "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "82b3e97e5f7620294eede876424e0c75", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "5d5a32f8689888afe15b4bf082e3a21e", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "d7267b05c7f8f62786f2f7990b0bf5fa", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "7a2710912719f036223e55afe427676f", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "e2ccdb0ee72f166b12dc33002b169f4c", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "8c7c457e748d8fcf3a067197ba1745fd", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "9b8e2960261083daaf8b4a283531a8bb", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "47bfa200bb3a75e5cd94c4bcddb74a68", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "6b865403653c3d080088e4e3cdba6f45", "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": "efa61468cf098f77cc6a234461d8b86d", diff --git a/CHANGELOG.md b/CHANGELOG.md index a529e969..d45647b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.37 (build 22021, api 9, 2024-09-30) +### 1.7.37 (build 22024, api 9, 2024-10-04) - 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/src/assets/ba_data/python/babase/_accountv2.py b/src/assets/ba_data/python/babase/_accountv2.py index f6544a50..b2ceccfe 100644 --- a/src/assets/ba_data/python/babase/_accountv2.py +++ b/src/assets/ba_data/python/babase/_accountv2.py @@ -64,11 +64,11 @@ class AccountV2Subsystem: def have_primary_credentials(self) -> bool: """Are credentials currently set for the primary app account? - Note that this does not mean these credentials are currently valid; - only that they exist. If/when credentials are validated, the 'primary' - account handle will be set. + Note that this does not mean these credentials have been checked + for validity; only that they exist. If/when credentials are + validated, the 'primary' account handle will be set. """ - raise NotImplementedError('This should be overridden.') + raise NotImplementedError() @property def primary(self) -> AccountV2Handle | None: @@ -105,9 +105,9 @@ class AccountV2Subsystem: on_completed=self._on_set_active_workspace_completed, ) else: - # Don't activate workspaces if we've already told the game - # that initial-log-in is done or if we've already kicked - # off a workspace load. + # Don't activate workspaces if we've already told the + # game that initial-log-in is done or if we've already + # kicked off a workspace load. _babase.screenmessage( f'\'{account.workspacename}\'' f' will be activated at next app launch.', @@ -264,11 +264,11 @@ class AccountV2Subsystem: def do_get_primary(self) -> AccountV2Handle | None: """Internal - should be overridden by subclass.""" - raise NotImplementedError('This should be overridden.') + raise NotImplementedError() def set_primary_credentials(self, credentials: str | None) -> None: """Set credentials for the primary app account.""" - raise NotImplementedError('This should be overridden.') + raise NotImplementedError() def _update_auto_sign_in(self) -> None: plus = _babase.app.plus diff --git a/src/assets/ba_data/python/babase/_appmode.py b/src/assets/ba_data/python/babase/_appmode.py index 26a8b6f8..17d4adca 100644 --- a/src/assets/ba_data/python/babase/_appmode.py +++ b/src/assets/ba_data/python/babase/_appmode.py @@ -54,7 +54,7 @@ class AppMode: """Called when the mode is being deactivated.""" def on_app_active_changed(self) -> None: - """Called when babase.app.active changes. + """Called when ba*.app.active changes while this mode is active. The app-mode may want to take action such as pausing a running game in such cases. diff --git a/src/assets/ba_data/python/babase/_apputils.py b/src/assets/ba_data/python/babase/_apputils.py index 05d2b3d5..e7448b24 100644 --- a/src/assets/ba_data/python/babase/_apputils.py +++ b/src/assets/ba_data/python/babase/_apputils.py @@ -115,7 +115,7 @@ def handle_v1_cloud_log() -> None: 'userRanCommands': _babase.has_user_run_commands(), 'time': _babase.apptime(), 'userModded': _babase.workspaces_in_use(), - 'newsShow': plus.get_news_show(), + 'newsShow': plus.get_classic_news_show(), } def response(data: Any) -> None: diff --git a/src/assets/ba_data/python/baclassic/_accountv1.py b/src/assets/ba_data/python/baclassic/_accountv1.py index 47b7daed..c8b40cbf 100644 --- a/src/assets/ba_data/python/baclassic/_accountv1.py +++ b/src/assets/ba_data/python/baclassic/_accountv1.py @@ -176,7 +176,9 @@ class AccountV1Subsystem: else {} ) for item_name, item in list(store_items.items()): - if item_name.startswith('icons.') and plus.get_purchased(item_name): + if item_name.startswith( + 'icons.' + ) and plus.get_v1_account_product_purchased(item_name): icons.append(item['icon']) return icons @@ -230,9 +232,9 @@ class AccountV1Subsystem: # Check our tickets-based pro upgrade and our two real-IAP based # upgrades. Also always unlock this stuff in ballistica-core builds. return bool( - plus.get_purchased('upgrades.pro') - or plus.get_purchased('static.pro') - or plus.get_purchased('static.pro_sale') + plus.get_v1_account_product_purchased('upgrades.pro') + or plus.get_v1_account_product_purchased('static.pro') + or plus.get_v1_account_product_purchased('static.pro_sale') or 'ballistica' + 'kit' == babase.appname() ) diff --git a/src/assets/ba_data/python/baclassic/_appmode.py b/src/assets/ba_data/python/baclassic/_appmode.py index 4910e3f1..e97ef8b0 100644 --- a/src/assets/ba_data/python/baclassic/_appmode.py +++ b/src/assets/ba_data/python/baclassic/_appmode.py @@ -15,7 +15,6 @@ from babase import ( AppIntentDefault, invoke_main_menu, screenmessage, - # in_main_menu, ) import _baclassic diff --git a/src/assets/ba_data/python/baclassic/_store.py b/src/assets/ba_data/python/baclassic/_store.py index f4690129..ffae5503 100644 --- a/src/assets/ba_data/python/baclassic/_store.py +++ b/src/assets/ba_data/python/baclassic/_store.py @@ -446,8 +446,9 @@ class StoreSubsystem: 'price.' + item, None ) if ticket_cost is not None: - if our_tickets >= ticket_cost and not plus.get_purchased( - item + if ( + our_tickets >= ticket_cost + and not plus.get_v1_account_product_purchased(item) ): count += 1 return count @@ -522,7 +523,7 @@ class StoreSubsystem: for section in store_layout[tab]: for item in section['items']: if item in sales_raw: - if not plus.get_purchased(item): + if not plus.get_v1_account_product_purchased(item): to_end = ( datetime.datetime.fromtimestamp( sales_raw[item]['e'], datetime.UTC @@ -550,7 +551,10 @@ class StoreSubsystem: if babase.app.env.gui: for map_section in self.get_store_layout()['maps']: for mapitem in map_section['items']: - if plus is None or not plus.get_purchased(mapitem): + if ( + plus is None + or not plus.get_v1_account_product_purchased(mapitem) + ): m_info = self.get_store_item(mapitem) unowned_maps.add(m_info['map_type'].name) return sorted(unowned_maps) @@ -563,7 +567,10 @@ class StoreSubsystem: if babase.app.env.gui: for section in self.get_store_layout()['minigames']: for mname in section['items']: - if plus is None or not plus.get_purchased(mname): + if ( + plus is None + or not plus.get_v1_account_product_purchased(mname) + ): m_info = self.get_store_item(mname) unowned_games.add(m_info['gametype']) return unowned_games diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 2f7b3e53..b57dd676 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 = 22021 +TARGET_BALLISTICA_BUILD = 22024 TARGET_BALLISTICA_VERSION = '1.7.37' diff --git a/src/assets/ba_data/python/baplus/_appsubsystem.py b/src/assets/ba_data/python/baplus/_appsubsystem.py index 0036a114..fd5b5281 100644 --- a/src/assets/ba_data/python/baplus/_appsubsystem.py +++ b/src/assets/ba_data/python/baplus/_appsubsystem.py @@ -40,7 +40,6 @@ class PlusAppSubsystem(AppSubsystem): _baplus.on_app_loading() self.accounts.on_app_loading() - # noinspection PyUnresolvedReferences @staticmethod def add_v1_account_transaction( transaction: dict, callback: Callable | None = None @@ -66,9 +65,9 @@ class PlusAppSubsystem(AppSubsystem): return _baplus.get_master_server_address(source, version) @staticmethod - def get_news_show() -> str: + def get_classic_news_show() -> str: """(internal)""" - return _baplus.get_news_show() + return _baplus.get_classic_news_show() @staticmethod def get_price(item: str) -> str | None: @@ -76,14 +75,14 @@ class PlusAppSubsystem(AppSubsystem): return _baplus.get_price(item) @staticmethod - def get_purchased(item: str) -> bool: + def get_v1_account_product_purchased(item: str) -> bool: """(internal)""" - return _baplus.get_purchased(item) + return _baplus.get_v1_account_product_purchased(item) @staticmethod - def get_purchases_state() -> int: + def get_v1_account_product_purchases_state() -> int: """(internal)""" - return _baplus.get_purchases_state() + return _baplus.get_v1_account_product_purchases_state() @staticmethod def get_v1_account_display_string(full: bool = True) -> str: @@ -129,7 +128,7 @@ class PlusAppSubsystem(AppSubsystem): def get_v1_account_ticket_count() -> int: """(internal) - Returns the number of tickets for the current account. + Return the number of tickets for the current account. """ return _baplus.get_v1_account_ticket_count() diff --git a/src/assets/ba_data/python/bascenev1lib/actor/spazappearance.py b/src/assets/ba_data/python/bascenev1lib/actor/spazappearance.py index 7cff4959..a2122d8f 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/spazappearance.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/spazappearance.py @@ -14,7 +14,7 @@ def get_appearances(include_locked: bool = False) -> list[str]: assert plus is not None assert bs.app.classic is not None - get_purchased = plus.get_purchased + get_purchased = plus.get_v1_account_product_purchased disallowed = [] if not include_locked: # Hmm yeah this'll be tough to hack... diff --git a/src/assets/ba_data/python/bauiv1/_uitypes.py b/src/assets/ba_data/python/bauiv1/_uitypes.py index 9158e7c8..00d906f1 100644 --- a/src/assets/ba_data/python/bauiv1/_uitypes.py +++ b/src/assets/ba_data/python/bauiv1/_uitypes.py @@ -199,8 +199,7 @@ class MainWindow(Window): def get_main_window_state(self) -> MainWindowState: """Return a WindowState to recreate this window, if supported.""" - # TODO - change to NotImplementedError when moved to MainWindow. - raise RuntimeError('FIXME NOT IMPLEMENTED') + raise NotImplementedError() class MainWindowState: diff --git a/src/assets/ba_data/python/bauiv1lib/coop/browser.py b/src/assets/ba_data/python/bauiv1lib/coop/browser.py index b3571047..690ce138 100644 --- a/src/assets/ba_data/python/bauiv1lib/coop/browser.py +++ b/src/assets/ba_data/python/bauiv1lib/coop/browser.py @@ -910,7 +910,7 @@ class CoopBrowserWindow(bui.MainWindow): # Show easter-egg-hunt either if its easter or we own it. if plus.get_v1_account_misc_read_val( 'easter', False - ) or plus.get_purchased('games.easter_egg_hunt'): + ) or plus.get_v1_account_product_purchased('games.easter_egg_hunt'): items = [ 'Challenges:Easter Egg Hunt', 'Challenges:Pro Easter Egg Hunt', @@ -1089,8 +1089,9 @@ class CoopBrowserWindow(bui.MainWindow): else: required_purchase = None - if required_purchase is not None and not plus.get_purchased( - required_purchase + if ( + required_purchase is not None + and not plus.get_v1_account_product_purchased(required_purchase) ): if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() diff --git a/src/assets/ba_data/python/bauiv1lib/coop/gamebutton.py b/src/assets/ba_data/python/bauiv1lib/coop/gamebutton.py index fee0a388..a5bd4744 100644 --- a/src/assets/ba_data/python/bauiv1lib/coop/gamebutton.py +++ b/src/assets/ba_data/python/bauiv1lib/coop/gamebutton.py @@ -243,7 +243,9 @@ class GameButton: ) or ( game in ('Challenges:Meteor Shower',) - and not plus.get_purchased('games.meteor_shower') + and not plus.get_v1_account_product_purchased( + 'games.meteor_shower' + ) ) or ( game @@ -251,15 +253,21 @@ class GameButton: 'Challenges:Target Practice', 'Challenges:Target Practice B', ) - and not plus.get_purchased('games.target_practice') + and not plus.get_v1_account_product_purchased( + 'games.target_practice' + ) ) or ( game in ('Challenges:Ninja Fight',) - and not plus.get_purchased('games.ninja_fight') + and not plus.get_v1_account_product_purchased( + 'games.ninja_fight' + ) ) or ( game in ('Challenges:Pro Ninja Fight',) - and not plus.get_purchased('games.ninja_fight') + and not plus.get_v1_account_product_purchased( + 'games.ninja_fight' + ) ) or ( game @@ -267,7 +275,9 @@ class GameButton: 'Challenges:Easter Egg Hunt', 'Challenges:Pro Easter Egg Hunt', ) - and not plus.get_purchased('games.easter_egg_hunt') + and not plus.get_v1_account_product_purchased( + 'games.easter_egg_hunt' + ) ) ): unlocked = False diff --git a/src/assets/ba_data/python/bauiv1lib/league/rankbutton.py b/src/assets/ba_data/python/bauiv1lib/league/rankbutton.py index 6aeee08f..da58d53f 100644 --- a/src/assets/ba_data/python/bauiv1lib/league/rankbutton.py +++ b/src/assets/ba_data/python/bauiv1lib/league/rankbutton.py @@ -393,9 +393,10 @@ class LeagueRankButton: def _default_on_activate_call(self) -> None: # pylint: disable=cyclic-import - from bauiv1lib.league.rankwindow import LeagueRankWindow + # from bauiv1lib.league.rankwindow import LeagueRankWindow - LeagueRankWindow(modal=True, origin_widget=self._button) + raise RuntimeError() + # LeagueRankWindow(modal=True, origin_widget=self._button) def set_position(self, position: tuple[float, float]) -> None: """Set the button's position.""" diff --git a/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py b/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py index a4a1fb67..0666147f 100644 --- a/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py +++ b/src/assets/ba_data/python/bauiv1lib/league/rankwindow.py @@ -7,7 +7,7 @@ from __future__ import annotations import copy import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from bauiv1lib.popup import PopupMenu import bauiv1 as bui @@ -23,7 +23,6 @@ class LeagueRankWindow(bui.MainWindow): self, transition: str | None = 'in_right', origin_widget: bui.Widget | None = None, - modal: bool = False, ): # pylint: disable=too-many-statements plus = bui.app.plus @@ -32,7 +31,6 @@ class LeagueRankWindow(bui.MainWindow): bui.set_analytics_screen('League Rank Window') self._league_rank_data: dict[str, Any] | None = None - self._modal = modal self._power_ranking_achievements_button: bui.Widget | None = None self._pro_mult_button: bui.Widget | None = None @@ -46,12 +44,6 @@ class LeagueRankWindow(bui.MainWindow): self._to_ranked_text: bui.Widget | None = None self._trophy_counts_reset_text: bui.Widget | None = None - # Need to handle transitioning out ourself for modal case - if origin_widget is not None: - self._transition_out = 'out_scale' - else: - self._transition_out = 'out_right' - assert bui.app.classic is not None uiscale = bui.app.ui_v1.uiscale self._width = 1490 if uiscale is bui.UIScale.SMALL else 1120 @@ -98,7 +90,7 @@ class LeagueRankWindow(bui.MainWindow): if uiscale is bui.UIScale.SMALL: self._back_button = bui.get_special_widget('back_button') bui.containerwidget( - edit=self._root_widget, on_cancel_call=self._back + edit=self._root_widget, on_cancel_call=self.main_window_back ) else: self._back_button = btn = bui.buttonwidget( @@ -107,11 +99,9 @@ class LeagueRankWindow(bui.MainWindow): size=(120, 60), scale=1.2, autoselect=True, - label=bui.Lstr( - resource='doneText' if self._modal else 'backText' - ), - button_type=None if self._modal else 'back', - on_activate_call=self._back, + label=bui.Lstr(resource='backText'), + button_type='back', + on_activate_call=self.main_window_back, ) bui.buttonwidget( edit=btn, @@ -185,6 +175,20 @@ class LeagueRankWindow(bui.MainWindow): ) self._update(show=info is None) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + transition=transition, origin_widget=origin_widget + ) + ) + + @override + def on_main_window_close(self) -> None: + self._save_state() + def _on_achievements_press(self) -> None: from bauiv1lib.achievements import AchievementsWindow @@ -1163,17 +1167,3 @@ class LeagueRankWindow(bui.MainWindow): def _save_state(self) -> None: pass - - def _back(self) -> None: - - # no-op if our underlying widget is dead or on its way out. - if not self._root_widget or self._root_widget.transitioning_out: - return - - self._save_state() - if self._modal: - bui.containerwidget( - edit=self._root_widget, transition=self._transition_out - ) - else: - self.main_window_back() diff --git a/src/assets/ba_data/python/bauiv1lib/purchase.py b/src/assets/ba_data/python/bauiv1lib/purchase.py index fbb74d75..51094091 100644 --- a/src/assets/ba_data/python/bauiv1lib/purchase.py +++ b/src/assets/ba_data/python/bauiv1lib/purchase.py @@ -155,7 +155,7 @@ class PurchaseWindow(bui.Window): if bui.app.classic.accounts.have_pro(): can_die = True else: - if plus.get_purchased(self._items[0]): + if plus.get_v1_account_product_purchased(self._items[0]): can_die = True if can_die: diff --git a/src/assets/ba_data/python/bauiv1lib/sendinfo.py b/src/assets/ba_data/python/bauiv1lib/sendinfo.py index f742a4c2..b1b8808d 100644 --- a/src/assets/ba_data/python/bauiv1lib/sendinfo.py +++ b/src/assets/ba_data/python/bauiv1lib/sendinfo.py @@ -6,7 +6,7 @@ from __future__ import annotations import time import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -164,6 +164,25 @@ class SendInfoWindow(bui.MainWindow): selected_child=self._text_field, ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + assert not self._modal + + # Pull stuff out of self here; if we do it in the lambda we'll + # keep self alive which we don't want. + legacy_code_mode = self._legacy_code_mode + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + legacy_code_mode=legacy_code_mode, + transition=transition, + origin_widget=origin_widget, + ) + ) + def _do_back(self) -> None: # pylint: disable=cyclic-import diff --git a/src/assets/ba_data/python/bauiv1lib/settings/gamepad.py b/src/assets/ba_data/python/bauiv1lib/settings/gamepad.py index c79c210a..d8b5de63 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/gamepad.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/gamepad.py @@ -6,7 +6,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override from bauiv1lib.popup import PopupMenuWindow import bascenev1 as bs @@ -14,6 +14,7 @@ import bauiv1 as bui if TYPE_CHECKING: from typing import Any, Callable + from bauiv1lib.popup import PopupWindow @@ -27,7 +28,7 @@ class GamepadSettingsWindow(bui.MainWindow): inputdevice: bs.InputDevice, *, modal: bool = False, - transition: str = 'in_right', + transition: str | None = 'in_right', transition_out: str = 'out_right', origin_widget: bui.Widget | None = None, settings: dict | None = None, @@ -76,6 +77,26 @@ class GamepadSettingsWindow(bui.MainWindow): # Don't ask to config joysticks while we're in here. self._rebuild_ui() + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull stuff out of self here; if we do it in the lambda we keep + # self alive which we don't want. + assert not self._is_secondary + assert not self._modal + + inputdevice = self._inputdevice + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + inputdevice=inputdevice, + transition=transition, + origin_widget=origin_widget, + ) + ) + def _get_config_mapping(self, default: bool = False) -> None: for button in [ 'buttonJump', diff --git a/src/assets/ba_data/python/bauiv1lib/settings/gamepadselect.py b/src/assets/ba_data/python/bauiv1lib/settings/gamepadselect.py index 382e353e..79c4abbf 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/gamepadselect.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/gamepadselect.py @@ -156,7 +156,12 @@ class GamepadSelectWindow(bui.MainWindow): class _NotConfigurableWindow(bui.MainWindow): - def __init__(self, device: bs.InputDevice) -> None: + def __init__( + self, + device: bs.InputDevice, + transition: str | None = 'in_right', + origin_widget: bui.Widget | None = None, + ) -> None: width = 700 height = 200 button_width = 80 @@ -170,9 +175,11 @@ class _NotConfigurableWindow(bui.MainWindow): ), size=(width, height), ), - transition='in_right', - origin_widget=None, + transition=transition, + origin_widget=origin_widget, ) + self.device = device + if device.allows_configuring_in_system_settings: msg = bui.Lstr( resource='configureDeviceInSystemSettingsText', @@ -212,10 +219,19 @@ class _NotConfigurableWindow(bui.MainWindow): ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) - # def _ok(self) -> None: + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) - # # Back would take us to the gamepad-select window. We want to go - # # past that. - # assert self.main_window_back_state is not None - # self.main_window_back_state = self.main_window_back_state.parent - # self.main_window_back() + # Pull stuff out of self here; if we do it in the lambda we'll + # keep self alive which we don't want. + device = self.device + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + device=device, + transition=transition, + origin_widget=origin_widget, + ) + ) diff --git a/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py b/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py index 6354fdf4..813bb2a6 100644 --- a/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py +++ b/src/assets/ba_data/python/bauiv1lib/soundtrack/macmusicapp.py @@ -5,7 +5,7 @@ from __future__ import annotations import copy -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, override import bauiv1 as bui @@ -90,6 +90,27 @@ class MacMusicAppPlaylistSelectWindow(bui.MainWindow): edit=self._root_widget, selected_child=self._scrollwidget ) + @override + def get_main_window_state(self) -> bui.MainWindowState: + # Support recreating our window for back/refresh purposes. + cls = type(self) + + # Pull stuff out of self here; if we do it in the lambda we wind + # up keeping self alive which we don't want. + callback = self._callback + existing_playlist = self._existing_playlist + existing_entry = self._existing_entry + + return bui.BasicMainWindowState( + create_call=lambda transition, origin_widget: cls( + callback=callback, + existing_playlist=existing_playlist, + existing_entry=existing_entry, + transition=transition, + origin_widget=origin_widget, + ) + ) + def _playlists_cb(self, playlists: list[str]) -> None: if self._column: for widget in self._column.get_children(): diff --git a/src/assets/ba_data/python/bauiv1lib/store/browser.py b/src/assets/ba_data/python/bauiv1lib/store/browser.py index 44771ac8..22c2909a 100644 --- a/src/assets/ba_data/python/bauiv1lib/store/browser.py +++ b/src/assets/ba_data/python/bauiv1lib/store/browser.py @@ -621,7 +621,7 @@ class StoreBrowserWindow(bui.MainWindow): assert bui.app.classic is not None purchased = bui.app.classic.accounts.have_pro() else: - purchased = plus.get_purchased(b_type) + purchased = plus.get_v1_account_product_purchased(b_type) sale_opacity = 0.0 sale_title_text: str | bui.Lstr = '' diff --git a/src/assets/ba_data/python/bauiv1lib/store/button.py b/src/assets/ba_data/python/bauiv1lib/store/button.py index 892db29e..7d061c90 100644 --- a/src/assets/ba_data/python/bauiv1lib/store/button.py +++ b/src/assets/ba_data/python/bauiv1lib/store/button.py @@ -283,7 +283,7 @@ class StoreButton: # Look at the current set of sales; filter any with time # remaining that we don't own. for sale_item, sale_info in list(sales_raw.items()): - if not plus.get_purchased(sale_item): + if not plus.get_v1_account_product_purchased(sale_item): to_end = ( datetime.datetime.fromtimestamp( sale_info['e'], datetime.UTC diff --git a/src/assets/ba_data/python/bauiv1lib/tournamententry.py b/src/assets/ba_data/python/bauiv1lib/tournamententry.py index ba0a76a4..ba34cb2e 100644 --- a/src/assets/ba_data/python/bauiv1lib/tournamententry.py +++ b/src/assets/ba_data/python/bauiv1lib/tournamententry.py @@ -742,7 +742,7 @@ class TournamentEntryWindow(PopupWindow): # This should have awarded us the tournament_entry_ad purchase; # make sure that's present. # (otherwise the server will ignore our tournament entry anyway) - if not plus.get_purchased('tournament_entry_ad'): + if not plus.get_v1_account_product_purchased('tournament_entry_ad'): print('no tournament_entry_ad purchase present in _on_ad_complete') bui.screenmessage(bui.Lstr(resource='errorText'), color=(1, 0, 0)) bui.getsound('error').play() @@ -781,7 +781,7 @@ class TournamentEntryWindow(PopupWindow): # the tournament. if (bui.apptime() - self._last_ticket_press_time < 6.0) and ( plus.have_outstanding_v1_account_transactions() - or plus.get_purchased(self._purchase_name) + or plus.get_v1_account_product_purchased(self._purchase_name) or self._entering ): bui.getsound('error').play() diff --git a/src/ballistica/base/app_mode/empty_app_mode.h b/src/ballistica/base/app_mode/empty_app_mode.h index 256763d9..f27c44f1 100644 --- a/src/ballistica/base/app_mode/empty_app_mode.h +++ b/src/ballistica/base/app_mode/empty_app_mode.h @@ -3,8 +3,6 @@ #ifndef BALLISTICA_BASE_APP_MODE_EMPTY_APP_MODE_H_ #define BALLISTICA_BASE_APP_MODE_EMPTY_APP_MODE_H_ -#include - #include "ballistica/base/app_mode/app_mode.h" #include "ballistica/shared/foundation/object.h" @@ -23,6 +21,7 @@ class EmptyAppMode : public AppMode { private: void Reset_(); + Object::Ref hello_text_group_; int reset_count_{}; bool hello_mode_{}; diff --git a/src/ballistica/base/base.h b/src/ballistica/base/base.h index 711b8462..40866f5c 100644 --- a/src/ballistica/base/base.h +++ b/src/ballistica/base/base.h @@ -821,6 +821,8 @@ class BaseFeatureSet : public FeatureSetNativeComponent, auto app_active() -> bool const { return app_active_; } + /// Reset the engine to a default state. App-modes generally call this + /// when activating. void Reset(); private: diff --git a/src/ballistica/base/ui/ui.cc b/src/ballistica/base/ui/ui.cc index 61b16b5a..c053f9ad 100644 --- a/src/ballistica/base/ui/ui.cc +++ b/src/ballistica/base/ui/ui.cc @@ -14,6 +14,7 @@ #include "ballistica/base/ui/dev_console.h" #include "ballistica/base/ui/ui_delegate.h" #include "ballistica/shared/foundation/event_loop.h" +#include "ballistica/shared/foundation/macros.h" #include "ballistica/shared/generic/utils.h" namespace ballistica::base { @@ -214,9 +215,9 @@ void UI::ActivatePartyIcon() { } } -void UI::SetPartyIconNumber(int val) { +void UI::SetSquadSizeLabel(int val) { if (auto* ui_delegate = g_base->ui->delegate()) { - ui_delegate->SetPartyIconNumber(val); + ui_delegate->SetSquadSizeLabel(val); } } @@ -248,12 +249,6 @@ auto UI::HandleMouseDown(int button, float x, float y, bool double_click) handled = dev_console_->HandleMouseDown(button, x, y); } - // if (!handled) { - // if (auto* ui_delegate = g_base->ui->delegate()) { - // handled = ui_delegate->HandleLegacyRootUIMouseDown(x, y); - // } - // } - if (!handled) { handled = SendWidgetMessage(WidgetMessage( WidgetMessage::Type::kMouseDown, nullptr, x, y, double_click ? 2 : 1)); @@ -280,10 +275,6 @@ void UI::HandleMouseUp(int button, float x, float y) { } } } - - // if (auto* ui_delegate = g_base->ui->delegate()) { - // ui_delegate->HandleLegacyRootUIMouseUp(x, y); - // } } auto UI::UIHasDirectKeyboardInput() const -> bool { @@ -352,10 +343,9 @@ void UI::SetUIInputDevice(InputDevice* input_device) { void UI::Reset() { assert(g_base->InLogicThread()); - // Reset and then deactivate any current delegate. + // Deactivate any current delegate. if (auto* ui_delegate = g_base->ui->delegate()) { - ui_delegate->Reset(); - g_base->ui->SetUIDelegate(nullptr); + SetUIDelegate(nullptr); } } @@ -366,10 +356,6 @@ auto UI::ShouldHighlightWidgets() const -> bool { return g_base->input->have_non_touch_inputs() && MainMenuVisible(); } -auto UI::ShouldShowButtonShortcuts() const -> bool { - return g_base->input->have_non_touch_inputs(); -} - auto UI::SendWidgetMessage(const WidgetMessage& m) -> bool { OperationContext operation_context; @@ -595,8 +581,17 @@ void UI::ShowURL(const std::string& url) { void UI::SetUIDelegate(base::UIDelegateInterface* delegate) { assert(g_base->InLogicThread()); - if (delegate == delegate_) { - return; + // We should always be either setting or clearing delegate; never setting + // redundantly. + if (delegate_) { + if (delegate) { + FatalError( + "Can\'t set UI Delegate when one is already set. Reset base first."); + } + } else { + if (!delegate) { + FatalError("Can\'t clear UI Delegate when already cleared."); + } } try { @@ -610,8 +605,8 @@ void UI::SetUIDelegate(base::UIDelegateInterface* delegate) { delegate_->OnActivate(); // Inform them that a few things changed, since they might have since - // the last time they were active (these callbacks only go to the *active* - // ui delegate). + // the last time they were active (these callbacks only go to the + // *active* ui delegate). delegate_->DoApplyAppConfig(); delegate_->OnScreenSizeChange(); delegate_->OnLanguageChange(); @@ -629,8 +624,8 @@ void UI::PushDevConsolePrintCall(const std::string& msg) { if (g_core->HeadlessMode()) { return; } - // If our event loop AND console are up and running, ship it off to - // be printed. Otherwise store it for the console to grab when it's ready. + // If our event loop AND console are up and running, ship it off to be + // printed. Otherwise store it for the console to grab when it's ready. if (auto* event_loop = g_base->logic->event_loop()) { if (dev_console_ != nullptr) { event_loop->PushCall([this, msg] { dev_console_->Print(msg); }); @@ -662,9 +657,11 @@ void UI::PushUIOperationRunnable(Runnable* runnable) { if (operation_context_ != nullptr) { // Once we're finishing the context, nothing else should be adding calls - // to it. UPDATE - this is actually ok. Things like widget-select - // commands can happen as part of user callbacks which themselves add - // additional callbacks to the current ui-operation. + // to it. + // + // UPDATE - this is actually ok. Things like widget-select commands can + // happen as part of user callbacks which themselves add additional + // callbacks to the current ui-operation. // // if (operation_context_->ran_finish()) { // auto trace = g_core->platform->GetNativeStackTrace(); diff --git a/src/ballistica/base/ui/ui.h b/src/ballistica/base/ui/ui.h index d16e6622..9e12aa04 100644 --- a/src/ballistica/base/ui/ui.h +++ b/src/ballistica/base/ui/ui.h @@ -42,8 +42,8 @@ class UI { void LanguageChanged(); - /// Reset all UI to a default state. Generally should be called when - /// switching app-modes or when resetting things within an app mode. + /// Reset all UI to a default state. Note that this includes deactivating + /// any current UI Delegate. void Reset(); void SetUIDelegate(base::UIDelegateInterface* delegate); @@ -59,7 +59,8 @@ class UI { auto PartyIconVisible() -> bool; auto PartyWindowOpen() -> bool; void ActivatePartyIcon(); - void SetPartyIconNumber(int val); + + void SetSquadSizeLabel(int val); auto HandleMouseDown(int button, float x, float y, bool double_click) -> bool; void HandleMouseUp(int button, float x, float y); @@ -109,10 +110,6 @@ class UI { /// present. auto ShouldHighlightWidgets() const -> bool; - /// Return whether currently selected widget should show button shortcuts. - /// These generally only get shown if a joystick of some form is present. - auto ShouldShowButtonShortcuts() const -> bool; - /// Get overall ui scale for the app. auto scale() const { return scale_; } @@ -140,9 +137,9 @@ class UI { auto ran_finish() const { return ran_finish_; } private: - bool ran_finish_{}; - OperationContext* parent_{}; std::vector runnables_; + OperationContext* parent_{}; + bool ran_finish_{}; }; private: @@ -151,18 +148,18 @@ class UI { auto InDevConsoleButton_(float x, float y) const -> bool; void DrawDevConsoleButton_(FrameDef* frame_def); + Object::Ref dev_console_button_txt_; + Object::WeakRef ui_input_device_; OperationContext* operation_context_{}; base::UIDelegateInterface* delegate_{}; DevConsole* dev_console_{}; std::string dev_console_startup_messages_; - Object::WeakRef ui_input_device_; millisecs_t last_input_device_use_time_{}; millisecs_t last_widget_input_reject_err_sound_time_{}; UIScale scale_{UIScale::kLarge}; bool force_scale_{}; bool show_dev_console_button_{}; bool dev_console_button_pressed_{}; - Object::Ref dev_console_button_txt_; }; } // namespace ballistica::base diff --git a/src/ballistica/base/ui/ui_delegate.h b/src/ballistica/base/ui/ui_delegate.h index e82e7095..5ab15bea 100644 --- a/src/ballistica/base/ui/ui_delegate.h +++ b/src/ballistica/base/ui/ui_delegate.h @@ -16,7 +16,7 @@ namespace ballistica::base { class UIDelegateInterface { public: - virtual void Reset() = 0; + // virtual void Reset() = 0; /// Called when this delegate is becoming the active one. virtual void OnActivate() = 0; @@ -40,7 +40,7 @@ class UIDelegateInterface { virtual auto PartyWindowOpen() -> bool = 0; virtual auto GetRootWidget() -> ui_v1::Widget* = 0; virtual auto SendWidgetMessage(const WidgetMessage& m) -> int = 0; - virtual void SetPartyIconNumber(int num) = 0; + virtual void SetSquadSizeLabel(int num) = 0; /// Should return true if this app mode can confirm quitting the app. virtual auto HasQuitConfirmDialog() -> bool = 0; diff --git a/src/ballistica/classic/support/classic_app_mode.cc b/src/ballistica/classic/support/classic_app_mode.cc index b99f7229..ac7fb69f 100644 --- a/src/ballistica/classic/support/classic_app_mode.cc +++ b/src/ballistica/classic/support/classic_app_mode.cc @@ -89,8 +89,8 @@ void ClassicAppMode::OnActivate() { Reset_(); - // To set initial states, explicitly fire some of our 'On-Foo-Changed' - // callbacks. + // Explicitly fire some of our 'On-Foo-Changed' callbacks to set initial + // states. DoApplyAppConfig(); LanguageChanged(); OnGameRosterChanged_(); @@ -453,7 +453,7 @@ void ClassicAppMode::SetGameRoster(cJSON* r) { void ClassicAppMode::OnGameRosterChanged_() { assert(g_base->InLogicThread()); - g_base->ui->SetPartyIconNumber(GetPartySize()); + g_base->ui->SetSquadSizeLabel(GetPartySize()); } auto ClassicAppMode::GetPartySize() const -> int { diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 921de124..1edeb4d4 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 = 22021; +const int kEngineBuildNumber = 22024; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 9; diff --git a/src/ballistica/ui_v1/ui_v1.cc b/src/ballistica/ui_v1/ui_v1.cc index c0be5304..9b6b38e5 100644 --- a/src/ballistica/ui_v1/ui_v1.cc +++ b/src/ballistica/ui_v1/ui_v1.cc @@ -79,8 +79,16 @@ bool UIV1FeatureSet::PartyIconVisible() { // Currently this is always visible. return true; } +void UIV1FeatureSet::SetAccountState(bool signed_in, const std::string& name) { + // Store the value and plug it in if we've got a live widget. + account_signed_in_ = signed_in; + account_name_ = name; + if (auto* r = root_widget()) { + root_widget_->SetAccountState(signed_in, name); + } +} -void UIV1FeatureSet::SetPartyIconNumber(int num) { +void UIV1FeatureSet::SetSquadSizeLabel(int num) { // Store the value and plug it in if we've got a live widget. party_icon_number_ = num; if (auto* r = root_widget()) { @@ -147,12 +155,8 @@ void UIV1FeatureSet::Draw(base::FrameDef* frame_def) { } } -void UIV1FeatureSet::OnActivate() { assert(g_base->InLogicThread()); } -void UIV1FeatureSet::OnDeactivate() { assert(g_base->InLogicThread()); } - -void UIV1FeatureSet::Reset() { - root_widget_.Clear(); - screen_root_widget_.Clear(); +void UIV1FeatureSet::OnActivate() { + assert(g_base->InLogicThread()); // (Re)create our screen-root widget. auto sw(Object::New()); @@ -181,10 +185,23 @@ void UIV1FeatureSet::Reset() { // Plug in current values for everything. rw->SetSquadSizeLabel(party_icon_number_); + rw->SetAccountState(account_signed_in_, account_name_); sw->GlobalSelect(); } +void UIV1FeatureSet::OnDeactivate() { + assert(g_base->InLogicThread()); + + root_widget_.Clear(); + screen_root_widget_.Clear(); +} + +// void UIV1FeatureSet::Reset() { +// printf("UIV1::Reset()\n"); + +// } + void UIV1FeatureSet::AddWidget(Widget* w, ContainerWidget* parent) { assert(g_base->InLogicThread()); diff --git a/src/ballistica/ui_v1/ui_v1.h b/src/ballistica/ui_v1/ui_v1.h index 5298d7f4..c2e149bc 100644 --- a/src/ballistica/ui_v1/ui_v1.h +++ b/src/ballistica/ui_v1/ui_v1.h @@ -87,7 +87,9 @@ class UIV1FeatureSet : public FeatureSetNativeComponent, auto PartyIconVisible() -> bool override; void ActivatePartyIcon() override; void Draw(base::FrameDef* frame_def) override; - void SetPartyIconNumber(int num) override; + + void SetSquadSizeLabel(int num) override; + void SetAccountState(bool signed_in, const std::string& name); UIV1Python* const python; @@ -109,7 +111,7 @@ class UIV1FeatureSet : public FeatureSetNativeComponent, // Return the absolute root widget; this includes persistent UI bits such // as the top/bottom bars auto root_widget() -> ui_v1::RootWidget* { return root_widget_.Get(); } - void Reset() override; + // void Reset() override; // Add a widget to a container. If a parent is provided, the widget is // added to it; otherwise it is added to the root widget. @@ -142,6 +144,8 @@ class UIV1FeatureSet : public FeatureSetNativeComponent, int party_icon_number_{}; bool always_use_internal_on_screen_keyboard_{}; bool party_window_open_{}; + bool account_signed_in_{}; + std::string account_name_{}; }; } // namespace ballistica::ui_v1 diff --git a/src/ballistica/ui_v1/widget/root_widget.cc b/src/ballistica/ui_v1/widget/root_widget.cc index 538fc3d0..70c1ef67 100644 --- a/src/ballistica/ui_v1/widget/root_widget.cc +++ b/src/ballistica/ui_v1/widget/root_widget.cc @@ -494,7 +494,7 @@ void RootWidget::Setup() { td.color_g = 0.8f; td.color_b = 0.8f; td.shadow = 1.0f; - AddText_(td); + account_name_text_ = AddText_(td); } } AddMeter_(MeterType::kLevel, 0.0f, 1.0f, 1.0f, 1.0f, false, "456/1000"); @@ -1262,6 +1262,21 @@ auto RootWidget::GetSpecialWidget(const std::string& s) const -> Widget* { return nullptr; } +void RootWidget::SetAccountState(bool signed_in, const std::string& name) { + if (account_name_text_) { + auto* w{account_name_text_->widget.Get()}; + assert(w); + + if (signed_in) { + w->SetText(name); + w->set_color(0.0f, 1.0f, 0.0f, 1.0f); + } else { + w->SetText("NOT SIGNED IN"); + w->set_color(1.0f, 0.2f, 0.2f, 1.0f); + } + } +} + void RootWidget::SetSquadSizeLabel(int val) { if (squad_size_text_) { auto* w{squad_size_text_->widget.Get()}; diff --git a/src/ballistica/ui_v1/widget/root_widget.h b/src/ballistica/ui_v1/widget/root_widget.h index e964dbbb..150c7f0b 100644 --- a/src/ballistica/ui_v1/widget/root_widget.h +++ b/src/ballistica/ui_v1/widget/root_widget.h @@ -36,6 +36,7 @@ class RootWidget : public ContainerWidget { void UpdateLayout() override; void SetSquadSizeLabel(int val); + void SetAccountState(bool signed_in, const std::string& name); private: struct ButtonDef; @@ -84,6 +85,7 @@ class RootWidget : public ContainerWidget { Button* level_meter_button_{}; Button* trophy_icon_{}; Text* squad_size_text_{}; + Text* account_name_text_{}; }; } // namespace ballistica::ui_v1