From 4dc322f956d089a43720ba2d204c0e4fc3ae9bfa Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 24 Sep 2024 16:05:55 -0700 Subject: [PATCH] window navigation improvements --- .efrocachemap | 56 ++--- CHANGELOG.md | 7 +- .../ba_data/python/baclassic/_appmode.py | 204 ++++++++++-------- src/assets/ba_data/python/baenv.py | 2 +- .../ba_data/python/bauiv1/_appsubsystem.py | 29 ++- src/assets/ba_data/python/bauiv1/_uitypes.py | 15 +- src/ballistica/shared/ballistica.cc | 2 +- 7 files changed, 194 insertions(+), 121 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index 51c316f7..b800ac8b 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -4096,26 +4096,26 @@ "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": "21a16533b62c491d0581609132c22dd5", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "fd60f24823b5fd2951acf06ad92d124b", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "87bba2b52609ee3ae31c2b1255218d93", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "bb123af5ef4bdede5248e4d0e086d623", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "78e44932b961f079ddf15fae69fed639", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "49210bd0982bf5eda8dd1074b0b26152", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "85fcee6b23abbf1c5a8e64fd95567b6e", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "6c881b22460cb58f93249bc9f7a95724", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "625390166d0eac624f14fc1688c638e7", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "66cfb48fb1975ca32a750754d16055eb", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "b459b77672b95838742903e0afd1d9ae", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "f17dd55c15904f515e53fc676658194f", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "b1a493c944b9e60a80482e0097699695", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "018ca530ee4e8eaf78c2ea50059f2da4", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "83ef6001e1ef561a33207c396a7dc8b0", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "a00d2cff684ae4df75e52159ead85824", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "775c7f67370eff8d333eda82a626531f", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "1fa9c1e758e790c263b45315b016fe11", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "8b9e532091efbf224cb410ebf66cfbcf", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "7fbbd61ecdcbb4a8e162b6045d2dcf53", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "4c5719f4c7ab007be49e25f7d1c2ebc3", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "f94530fb06665cc65da84a0998a8c34f", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "4565fe7bf5497a1e6f26791d370cbf36", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "861bb4628d6e98833f34cd7fe188ccb4", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "ef45f0ea1f16016366069670869a105b", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "ecb70cb07e1f2a971faa6932278e623e", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "80cad1c9c9d7e95bba8fca46a7ad71cb", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "a62d9dcfec465b4e8e9e7b516ce20d6c", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "53ea2045ee7324176fc41f2c92e34c83", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "a48f988081b53a8cef28978e2779ad53", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "ca6f9f14f49e9578c79d4e192bae2a23", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "b3189be75ff31435fbd0deebf4d05d86", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "37457582e66d96fd63583e64d3392521", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "1505da6f4c3b5a5b5987c485271f567f", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "540e2954f30c48148e1c4824f484ba42", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "bd41f4930a3c1b0dfe1eb992bd1bd2c4", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "d226791f74aa398fd07909ba69eb2a19", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "59f65a8cbcdf13fcb30aec30d053fa85", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "cefcdb5c49a4a3f848119a9159d832f7", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "ea787281130d9e3565dd49b7776fb3f0", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "ad908b297b41c2fdf13582e34c434245", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "086a2ce72497e44079ad6b747fc5439f", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "ad908b297b41c2fdf13582e34c434245", @@ -4132,14 +4132,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "d7a1d4deb51b0792d083737477e6833b", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "4c11b81a574aa9af593f54db4d998e61", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "d7a1d4deb51b0792d083737477e6833b", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "564675e2f00a311387a6e621f3b67332", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "93395e2263f9ed10160dd8e80811be77", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "24445c70a851b691690803c87af33c81", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "cf286af8eb7762893ee935e08975eb60", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "33b5f0f70ad2d8775dee1fd810f319e5", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "74a2c3fa9e709ca034a106d56c3b3e36", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "8d97d249be1218c6277dc1de54e5c6b8", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "892e10ddcf3b8f1dd83e5d0303594273", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "d52d476f324fd3c0c1f99add058aa405", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "059bd84629b72597c692b3a6b6cf6aa9", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "8428089ffce127d5eedf8d9cbafa2ffa", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "0d267d44801387189b44896d4b6027b3", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "114f954bc27541998dce635b25e3ec01", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "eb84b5585f44e853604fa059ac57f388", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "579d3f0ad1d0f79522408d6197413a88", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "85b61a46caa9ada867f0c643ff28b6cd", "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 f2adaa5b..229ce86c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.37 (build 22010, api 9, 2024-09-24) +### 1.7.37 (build 22011, api 9, 2024-09-24) - 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. @@ -101,6 +101,11 @@ - There is now a `ba*.app.classic.save_ui_state()` method that should be called right before jumping into a game/replay/etc. This will save a state that will automatically be restored the next time the main menu activity is entered. +- (build 22010) Added the concept of 'auxiliary' windows and used them to make + various window navigation more intuitive. Example: previously, if you were on + the co-op screen and pressed the trophy toolbar icon to see your league rank + and then pressed back, you would be taken back to the top level main menu. Now + it will take you back to the co-op screen. ### 1.7.36 (build 21944, api 8, 2024-07-26) - Wired up Tokens, BombSquad's new purchasable currency. The first thing these diff --git a/src/assets/ba_data/python/baclassic/_appmode.py b/src/assets/ba_data/python/baclassic/_appmode.py index 07bc250b..85e5a6d2 100644 --- a/src/assets/ba_data/python/baclassic/_appmode.py +++ b/src/assets/ba_data/python/baclassic/_appmode.py @@ -15,14 +15,16 @@ from babase import ( AppIntentDefault, invoke_main_menu, screenmessage, - in_main_menu, + # in_main_menu, ) import _baclassic if TYPE_CHECKING: + from typing import Callable + from babase import AppIntent - from bauiv1 import UIV1AppSubsystem, MainWindow + from bauiv1 import UIV1AppSubsystem, MainWindow, MainWindowState class ClassicAppMode(AppMode): @@ -124,38 +126,6 @@ class ClassicAppMode(AppMode): if not app.active: invoke_main_menu() - def _jump_to_main_window(self, window: MainWindow) -> None: - """Jump to a window with the main menu as its parent.""" - from bauiv1lib.mainmenu import MainMenuWindow - from bauiv1lib.ingamemenu import InGameMenuWindow - - ui = app.ui_v1 - - old_window = ui.get_main_window() - - if isinstance(old_window, (MainMenuWindow, InGameMenuWindow)): - # If we're currently in the top level menu window, just push - # our mainwindow on to the end. - old_window.main_window_replace(window) - else: - # Blow away the window stack and build a fresh one. - ui.clear_main_window() - - back_state = ( - MainMenuWindow.do_get_main_window_state() - if in_main_menu() - else InGameMenuWindow.do_get_main_window_state() - ) - # set_main_window() needs this to be set. - back_state.is_top_level = True - - ui.set_main_window( - window, - from_window=False, # Disable from-check. - back_state=back_state, - suppress_warning=True, - ) - def _root_ui_menu_press(self) -> None: from babase import push_back_press @@ -173,18 +143,11 @@ class ClassicAppMode(AppMode): import bauiv1 from bauiv1lib.account.settings import AccountSettingsWindow - ui = app.ui_v1 - - # If the window is already showing, back out of it. - current_main_window = ui.get_main_window() - if isinstance(current_main_window, AccountSettingsWindow): - current_main_window.main_window_back() - return - - self._jump_to_main_window( - AccountSettingsWindow( + self._auxiliary_window_nav( + win_type=AccountSettingsWindow, + win_create_call=lambda: AccountSettingsWindow( origin_widget=bauiv1.get_special_widget('account_button') - ) + ), ) def _root_ui_squad_press(self) -> None: @@ -201,18 +164,100 @@ class ClassicAppMode(AppMode): import bauiv1 from bauiv1lib.settings.allsettings import AllSettingsWindow + self._auxiliary_window_nav( + win_type=AllSettingsWindow, + win_create_call=lambda: AllSettingsWindow( + origin_widget=bauiv1.get_special_widget('settings_button') + ), + ) + + def _auxiliary_window_nav( + self, + win_type: type[MainWindow], + win_create_call: Callable[[], MainWindow], + ) -> None: + """Navigate to or away from a particular type of Auxiliary window.""" + # pylint: disable=unidiomatic-typecheck + ui = app.ui_v1 - # If the window is already showing, back out of it. current_main_window = ui.get_main_window() - if isinstance(current_main_window, AllSettingsWindow): + + # Scan our ancestors for auxiliary states matching our type as + # well as auxiliary states in general. + aux_matching_state: MainWindowState | None = None + aux_state: MainWindowState | None = None + + if current_main_window is None: + raise RuntimeError( + 'Not currently handling no-top-level-window case.' + ) + + state = current_main_window.main_window_back_state + while state is not None: + assert state.window_type is not None + if state.is_auxiliary: + if state.window_type is win_type: + aux_matching_state = state + else: + aux_state = state + + state = state.parent + + # If there's an ancestor auxiliary window-state matching our + # type, back out past it (example: poking settings, navigating + # down a level or two, and then poking settings again should + # back out of settings). + if aux_matching_state is not None: + current_main_window.main_window_back_state = ( + aux_matching_state.parent + ) current_main_window.main_window_back() return - self._jump_to_main_window( - AllSettingsWindow( - origin_widget=bauiv1.get_special_widget('settings_button') + # If there's an ancestory auxiliary state *not* matching our + # type, crop the state and swap in our new auxiliary UI + # (example: poking settings, then poking account, then poking + # back should end up where things were before the settings + # poke). + if aux_state is not None: + # Blow away the window stack and build a fresh one. + ui.clear_main_window() + ui.set_main_window( + win_create_call(), + from_window=False, # Disable from-check. + back_state=aux_state.parent, + suppress_warning=True, + is_auxiliary=True, ) + return + + # Ok, no auxiliary states found. Now if current window is auxiliary + # and the type matches, simply do a back. + if ( + current_main_window.main_window_is_auxiliary + and type(current_main_window) is win_type + ): + current_main_window.main_window_back() + return + + # If current window is auxiliary but type doesn't match, + # swap it out for our new auxiliary UI. + if current_main_window.main_window_is_auxiliary: + ui.clear_main_window() + ui.set_main_window( + win_create_call(), + from_window=False, # Disable from-check. + back_state=current_main_window.main_window_back_state, + suppress_warning=True, + is_auxiliary=True, + ) + return + + # Ok, no existing auxiliary stuff was found period. Just + # navigate forward to this UI. + current_main_window.main_window_replace( + win_create_call(), is_auxiliary=True ) def _root_ui_achievements_press(self) -> None: @@ -235,18 +280,11 @@ class ClassicAppMode(AppMode): import bauiv1 from bauiv1lib.store.browser import StoreBrowserWindow - ui = app.ui_v1 - - # If the window is already showing, back out of it. - current_main_window = ui.get_main_window() - if isinstance(current_main_window, StoreBrowserWindow): - current_main_window.main_window_back() - return - - self._jump_to_main_window( - StoreBrowserWindow( + self._auxiliary_window_nav( + win_type=StoreBrowserWindow, + win_create_call=lambda: StoreBrowserWindow( origin_widget=bauiv1.get_special_widget('store_button') - ) + ), ) def _root_ui_tickets_meter_press(self) -> None: @@ -270,25 +308,17 @@ class ClassicAppMode(AppMode): from bauiv1lib.account import show_sign_in_prompt from bauiv1lib.league.rankwindow import LeagueRankWindow - ui = app.ui_v1 - - # If the window is already showing, back out of it. - current_main_window = ui.get_main_window() - if isinstance(current_main_window, LeagueRankWindow): - current_main_window.main_window_back() - return - plus = bauiv1.app.plus assert plus is not None - if plus.get_v1_account_state() != 'signed_in': show_sign_in_prompt() return - self._jump_to_main_window( - LeagueRankWindow( + self._auxiliary_window_nav( + win_type=LeagueRankWindow, + win_create_call=lambda: LeagueRankWindow( origin_widget=bauiv1.get_special_widget('trophy_meter') - ) + ), ) def _root_ui_level_meter_press(self) -> None: @@ -303,19 +333,25 @@ class ClassicAppMode(AppMode): import bauiv1 from bauiv1lib.inventory import InventoryWindow - ui = app.ui_v1 - - # If the window is already showing, back out of it. - current_main_window = ui.get_main_window() - if isinstance(current_main_window, InventoryWindow): - current_main_window.main_window_back() - return - - self._jump_to_main_window( - InventoryWindow( + self._auxiliary_window_nav( + win_type=InventoryWindow, + win_create_call=lambda: InventoryWindow( origin_widget=bauiv1.get_special_widget('inventory_button') - ) + ), ) + # ui = app.ui_v1 + + # # If the window is already showing, back out of it. + # current_main_window = ui.get_main_window() + # if isinstance(current_main_window, InventoryWindow): + # current_main_window.main_window_back() + # return + + # self._jump_to_auxiliary_window( + # InventoryWindow( + # origin_widget=bauiv1.get_special_widget('inventory_button') + # ) + # ) def _root_ui_get_tokens_press(self) -> None: import bauiv1 diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 4886940b..00a3d142 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 = 22010 +TARGET_BALLISTICA_BUILD = 22011 TARGET_BALLISTICA_VERSION = '1.7.37' diff --git a/src/assets/ba_data/python/bauiv1/_appsubsystem.py b/src/assets/ba_data/python/bauiv1/_appsubsystem.py index 9eeb6755..9711c51b 100644 --- a/src/assets/ba_data/python/bauiv1/_appsubsystem.py +++ b/src/assets/ba_data/python/bauiv1/_appsubsystem.py @@ -181,8 +181,10 @@ class UIV1AppSubsystem(babase.AppSubsystem): f' cannot use auto-back.' ) - # Valid states should have a value here. + # Valid states should have values here. assert back_state.is_top_level is not None + assert back_state.is_auxiliary is not None + assert back_state.window_type is not None backwin = back_state.create_window(transition='in_left') @@ -205,6 +207,7 @@ class UIV1AppSubsystem(babase.AppSubsystem): from_window: bauiv1.MainWindow | None | bool = True, is_back: bool = False, is_top_level: bool = False, + is_auxiliary: bool = False, back_state: MainWindowState | None = None, suppress_warning: bool = False, ) -> None: @@ -214,6 +217,7 @@ class UIV1AppSubsystem(babase.AppSubsystem): MainWindow methods main_window_replace() and main_window_back() should be used when possible for navigation. """ + # pylint: disable=too-many-locals # pylint: disable=too-many-branches # pylint: disable=too-many-statements from bauiv1._uitypes import MainWindow @@ -254,9 +258,13 @@ class UIV1AppSubsystem(babase.AppSubsystem): # If they passed a back-state, make sure it is fully filled out. if back_state is not None: - if back_state.is_top_level is None: + if ( + back_state.is_top_level is None + or back_state.is_auxiliary is None + or back_state.window_type is None + ): raise RuntimeError( - 'back_state.is_top_level has not been set.' + 'Provided back_state is incomplete.' ' Make sure to only pass fully-filled-out MainWindowStates.' ) # If a top-level main-window is being set, complain if there already @@ -309,18 +317,24 @@ class UIV1AppSubsystem(babase.AppSubsystem): logging.exception('Error checking from_window') if is_back: - # is_top_level should never be True here (only applies forward). + # These values should only be passed for forward navigation. assert not is_top_level - # Always should have back_state in this case. + assert not is_auxiliary + # Make sure back state is complete. assert back_state is not None assert back_state.is_top_level is not None + assert back_state.is_auxiliary is not None + assert back_state.window_type is type(window) window.main_window_back_state = back_state.parent window.main_window_is_top_level = back_state.is_top_level + window.main_window_is_auxiliary = back_state.is_auxiliary else: # Store if the window is top-level so we won't complain later if # we go back from it and there's nowhere to go to. window.main_window_is_top_level = is_top_level + window.main_window_is_auxiliary = is_auxiliary + # When navigating forward, generate a back-window-state from # the outgoing window. if is_top_level: @@ -386,6 +400,8 @@ class UIV1AppSubsystem(babase.AppSubsystem): # Store some common window stuff on its state. winstate.parent = window.main_window_back_state winstate.is_top_level = window.main_window_is_top_level + winstate.is_auxiliary = window.main_window_is_auxiliary + winstate.window_type = type(window) return winstate @@ -397,12 +413,15 @@ class UIV1AppSubsystem(babase.AppSubsystem): # Valid states should have a value here. assert state.is_top_level is not None + assert state.is_auxiliary is not None + assert state.window_type is not None win = state.create_window(transition=None) self.set_main_window( win, from_window=False, # disable check is_top_level=state.is_top_level, + is_auxiliary=state.is_auxiliary, back_state=state.parent, suppress_warning=True, ) diff --git a/src/assets/ba_data/python/bauiv1/_uitypes.py b/src/assets/ba_data/python/bauiv1/_uitypes.py index 00edc4cb..16815e04 100644 --- a/src/assets/ba_data/python/bauiv1/_uitypes.py +++ b/src/assets/ba_data/python/bauiv1/_uitypes.py @@ -65,6 +65,13 @@ class MainWindow(Window): self.main_window_is_top_level: bool = False + # Windows can be flagged as auxiliary when not related to the + # main UI task at hand. UI code may choose to handle auxiliary + # windows in special ways, such as by implicitly replacing + # existing auxiliary windows with new ones instead of keeping + # old ones as back targets. + self.main_window_is_auxiliary: bool = False + self._main_window_transition = transition self._main_window_origin_widget = origin_widget super().__init__(root_widget, cleanupcheck) @@ -147,7 +154,10 @@ class MainWindow(Window): self.main_window_close() def main_window_replace( - self, new_window: MainWindow, back_state: MainWindowState | None = None + self, + new_window: MainWindow, + back_state: MainWindowState | None = None, + is_auxiliary: bool = False, ) -> None: """Replace ourself with a new MainWindow.""" @@ -177,6 +187,7 @@ class MainWindow(Window): new_window, from_window=self, back_state=back_state, + is_auxiliary=is_auxiliary, suppress_warning=True, ) @@ -203,6 +214,8 @@ class MainWindowState: # The window that back/cancel navigation should take us to. self.parent: MainWindowState | None = None self.is_top_level: bool | None = None + self.is_auxiliary: bool | None = None + self.window_type: type[MainWindow] | None = None def create_window( self, diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 7500892e..15c6dc5b 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 = 22010; +const int kEngineBuildNumber = 22011; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 9;