app-modes now discoverable for testing via meta-tags

This commit is contained in:
Eric Froemling 2024-11-14 18:35:17 -08:00
parent 8b88d62e8a
commit d9024b9d06
No known key found for this signature in database
13 changed files with 120 additions and 100 deletions

72
.efrocachemap generated
View File

@ -4099,42 +4099,42 @@
"build/assets/windows/Win32/ucrtbased.dll": "bfd1180c269d3950b76f35a63655e9e1", "build/assets/windows/Win32/ucrtbased.dll": "bfd1180c269d3950b76f35a63655e9e1",
"build/assets/windows/Win32/vc_redist.x86.exe": "15a5f1f876503885adbdf5b3989b3718", "build/assets/windows/Win32/vc_redist.x86.exe": "15a5f1f876503885adbdf5b3989b3718",
"build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599",
"build/prefab/full/linux_arm64_gui/debug/ballisticakit": "c933e9fa75e0852ffb19f4980bdc4fbc", "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "ecce51fae568b9707c40a39fbf3a3c5f",
"build/prefab/full/linux_arm64_gui/release/ballisticakit": "8f2ee725f54034f995057b4d3ad4520e", "build/prefab/full/linux_arm64_gui/release/ballisticakit": "55e2a22a34a9be909e26c994fb8ea04e",
"build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "18790bb9de9c00fb1f6d7c1224ee6186", "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "5e7ad42b0231a8e9ed021b1c389da269",
"build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "792dca3022d0173aaba44a49ecbfb780", "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "9d0fc45c65d34d595af470cf83694bf5",
"build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "bdb0dabe81f3081adfdef2b4f263b733", "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "63159906ae9af2b667bd70effd4dabe7",
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "dbd5ce0b4af918c693cb89d8fde11d48", "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "bff1c5b6386348a6182707f2b3cdae62",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "4a5a81688df1771f4871648f91a3f0c0", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "fa4e52fa3d0d9e18d6700bd8057b196d",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "b9bc795bfeec565181c6985c09eae809", "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "0158103f20133191f92dbd5f9f4db6b5",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "d3dbadc2a27f1cd6ec8a17b754290321", "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "0b28e5294e7f5e75265fdf23b9aacf73",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "8f8d56a18eac08a092fea3168397c465", "build/prefab/full/mac_arm64_gui/release/ballisticakit": "3db1de36fc4bc7779a96abe5d5e08af5",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "b1ae4b2e789600f44bb4ce15aa2e2848", "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "ca92fc0dbae8d0257eafcedbd7253f71",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "45ef289a4291c79f9caf6c13769418f7", "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "5e4d1ff3c9f1eae795ff22d378ac00f9",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "945ab6076d2c24b9480403c5a01bb558", "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "3053e0bada8af66f14dd057f92149219",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "553424754c2336abaa0f921cf89bb664", "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "7a1b405aa133401a170f07e5eefe9117",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "e1000aacfe672cedb0a73525a6e9a277", "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "94bf374b52eeee75056f2df342fcbc6e",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "6bf81ae3af014a26c4b29cc54b40cdaa", "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "ec4d6375e15add5f09eff1548b270084",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "45b1203c8f48993bb49cb5ede270cbbf", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "1d372863f6743d0e402252625039347a",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "462796ac70e26fe008fc0930753e8036", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "d33f46eee6acbbb23ced2fde0b3c8617",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "45b1203c8f48993bb49cb5ede270cbbf", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "1d372863f6743d0e402252625039347a",
"build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "462796ac70e26fe008fc0930753e8036", "build/prefab/lib/linux_arm64_server/release/libballisticaplus.a": "d33f46eee6acbbb23ced2fde0b3c8617",
"build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "5be54ca87f60ffd6430108322a3b2751", "build/prefab/lib/linux_x86_64_gui/debug/libballisticaplus.a": "dff40e5da979f86971b81a82753b35c7",
"build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "7f6452f6dea8fe19e32de7a7b1dc1fff", "build/prefab/lib/linux_x86_64_gui/release/libballisticaplus.a": "3e3b687f20740625087efd9b206605f8",
"build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "5be54ca87f60ffd6430108322a3b2751", "build/prefab/lib/linux_x86_64_server/debug/libballisticaplus.a": "dff40e5da979f86971b81a82753b35c7",
"build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "7f6452f6dea8fe19e32de7a7b1dc1fff", "build/prefab/lib/linux_x86_64_server/release/libballisticaplus.a": "3e3b687f20740625087efd9b206605f8",
"build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "0aa4c2291dbe7816e7b2eb09ed601ed5", "build/prefab/lib/mac_arm64_gui/debug/libballisticaplus.a": "3c0e995c26af01aed002e720b2498302",
"build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "97e07be89d10a5c224d0ac3dca502e7b", "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "e8df0adda61c64e63b8755d909f0113b",
"build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "0aa4c2291dbe7816e7b2eb09ed601ed5", "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "3c0e995c26af01aed002e720b2498302",
"build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "97e07be89d10a5c224d0ac3dca502e7b", "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "e8df0adda61c64e63b8755d909f0113b",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "feaed1063af13244171db9c61157b9a9", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "0d6db8516440603342edae1efed0cd52",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "a7dceed0a0f334be43831f3864567fc4", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "a2f95c8bb1fd261bbc2d47b7559e7d4e",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "85822d126ffd2b4db23bd906a6b5b1dd", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "b81c189c2c6a79e92dbfe3d0dd5c6adf",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "bac58b7621986d34574ec80b116a8b1b", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "673f2b052879488544dc1d0b6e46ae27",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "b3cb346360fe9a756e7e14fe187f597e", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "5cbaad5b761638f0c23505504739790b",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "2ae6dbf71ea9641283a4e4169384efea", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "121bc8047b8f0b20cdc7139a92fcb50b",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "48c3ae178cf929bce8b74f30bd42a85a", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "3fc2c917f416dad9e4c2413a96da5702",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "f55ec3ed54fd4704ee51be98ce1fea38", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "667d6372dbd8862fd9542ee4b3d1ae88",
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
"src/assets/ba_data/python/babase/_mgen/enums.py": "794d258d59fd17a61752843a9a0551ad", "src/assets/ba_data/python/babase/_mgen/enums.py": "794d258d59fd17a61752843a9a0551ad",
"src/ballistica/base/mgen/pyembed/binding_base.inc": "3a583e7e03bd4907b21adc3bf5729d15", "src/ballistica/base/mgen/pyembed/binding_base.inc": "3a583e7e03bd4907b21adc3bf5729d15",

View File

@ -1,4 +1,4 @@
### 1.7.37 (build 22101, api 9, 2024-11-13) ### 1.7.37 (build 22102, api 9, 2024-11-14)
- Bumping api version to 9. As you'll see below, there's some UI changes that - 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 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. touch UI stuff at all you can simply bump your api version and call it a day.
@ -156,6 +156,14 @@
up `make preflight` to use this to keep things moving a bit faster. If you are up `make preflight` to use this to keep things moving a bit faster. If you are
not familiar with it, the `preflight` target is handy to run before committing not familiar with it, the `preflight` target is handy to run before committing
code to git. code to git.
- The app-modes tab in the dev-console now uses the meta tag system to discover
testable app-modes. Previously this would simply list the `default_app_modes`
listed in the projectconfig.json. So now it is possible to make and explicitly
test new app modes via mod scripts on vanilla game builds. Note that the game
still uses the `default_app_modes` projectconfig.json value when selecting
app-modes at runtime; to change this you need to either change your
projectconfig and rebuild or replace `ba*.app.mode_selector` at runtime with
a custom selector that selects your custom app-mode(s).
### 1.7.36 (build 21944, api 8, 2024-07-26) ### 1.7.36 (build 21944, api 8, 2024-07-26)
- Wired up Tokens, BombSquad's new purchasable currency. The first thing these - Wired up Tokens, BombSquad's new purchasable currency. The first thing these

View File

@ -9,6 +9,8 @@ a more focused way.
""" """
# pylint: disable=redefined-builtin # pylint: disable=redefined-builtin
# ba_meta require api 9
# The stuff we expose here at the top level is our 'public' api for use # The stuff we expose here at the top level is our 'public' api for use
# from other modules/packages. Code *within* this package should import # from other modules/packages. Code *within* this package should import
# things from this package's submodules directly to reduce the chance of # things from this package's submodules directly to reduce the chance of

View File

@ -152,24 +152,6 @@ class App:
# __DEFAULT_APP_MODE_SELECTION_END__ # __DEFAULT_APP_MODE_SELECTION_END__
@override
def testable_app_modes(self) -> list[type[AppMode]]:
# pylint: disable=cyclic-import
# __DEFAULT_TESTABLE_APP_MODES_BEGIN__
# This section generated by batools.appmodule; do not edit.
# Return all our default_app_modes as testable.
# (generated from 'default_app_modes' in projectconfig).
import baclassic
import babase
return [
baclassic.ClassicAppMode,
babase.EmptyAppMode,
]
# __DEFAULT_TESTABLE_APP_MODES_END__
def __init__(self) -> None: def __init__(self) -> None:
"""(internal) """(internal)

View File

@ -30,15 +30,3 @@ class AppModeSelector:
limited to logic thread use/etc. limited to logic thread use/etc.
""" """
raise NotImplementedError() raise NotImplementedError()
def testable_app_modes(self) -> list[type[AppMode]]:
"""Return a list of modes to appear in the dev-console app-mode ui.
The user can switch between these app modes for testing. App-modes
will be passed an AppIntentDefault when selected by the user.
Note that in normal circumstances AppModes should never be
selected explicitly by the user but rather determined implicitly
based on AppIntents.
"""
raise NotImplementedError()

View File

@ -33,13 +33,43 @@ class DevConsoleTabPython(DevConsoleTab):
class DevConsoleTabAppModes(DevConsoleTab): class DevConsoleTabAppModes(DevConsoleTab):
"""Tab to switch app modes.""" """Tab to switch app modes."""
def __init__(self) -> None:
self._app_modes: list[type[AppMode]] | None = None
self._app_modes_loading = False
def _on_app_modes_loaded(self, modes: list[type[AppMode]]) -> None:
from babase._appintent import AppIntentDefault
intent = AppIntentDefault()
# Limit to modes that can handle default intents since that's
# what we use.
self._app_modes = [
mode for mode in modes if mode.can_handle_intent(intent)
]
self.request_refresh()
@override @override
def refresh(self) -> None: def refresh(self) -> None:
from babase import AppMode
# Kick off a load if applicable.
if self._app_modes is None and not self._app_modes_loading:
_babase.app.meta.load_exported_classes(
AppMode, self._on_app_modes_loaded
)
# Just say 'loading' if we don't have app-modes yet.
if self._app_modes is None:
self.text(
'Loading...', pos=(0, 30), h_anchor='center', h_align='center'
)
return
bwidth = 260 bwidth = 260
bpadding = 5 bpadding = 5
modes = _babase.app.mode_selector.testable_app_modes()
xoffs = -0.5 * bwidth * len(modes) xoffs = -0.5 * bwidth * len(self._app_modes)
self.text( self.text(
'Available AppModes:', 'Available AppModes:',
@ -49,7 +79,7 @@ class DevConsoleTabAppModes(DevConsoleTab):
v_align='center', v_align='center',
) )
# pylint: disable=protected-access # pylint: disable=protected-access
for i, mode in enumerate(modes): for i, mode in enumerate(self._app_modes):
self.button( self.button(
f'{mode.__module__}.{mode.__qualname__}', f'{mode.__module__}.{mode.__qualname__}',
pos=(xoffs + i * bwidth + bpadding, 10), pos=(xoffs + i * bwidth + bpadding, 10),
@ -78,7 +108,8 @@ class DevConsoleTabAppModes(DevConsoleTab):
_babase.app.set_intent(intent) _babase.app.set_intent(intent)
# Slight hackish: need to wait a moment before refreshing to # Slight hackish: need to wait a moment before refreshing to
# pick up the new mode, as mode switches are asynchronous. # pick up the newly current mode, as mode switches are
# asynchronous.
_babase.apptimer(0.1, self.request_refresh) _babase.apptimer(0.1, self.request_refresh)

View File

@ -15,6 +15,7 @@ if TYPE_CHECKING:
from babase import AppIntent from babase import AppIntent
# ba_meta export babase.AppMode
class EmptyAppMode(AppMode): class EmptyAppMode(AppMode):
"""An AppMode that does not do much at all.""" """An AppMode that does not do much at all."""

View File

@ -279,7 +279,7 @@ class DirectoryScan:
except Exception: except Exception:
logging.exception("metascan: Error scanning '%s'.", subpath) logging.exception("metascan: Error scanning '%s'.", subpath)
# Sort our results # Sort our results.
for exportlist in self.results.exports.values(): for exportlist in self.results.exports.values():
exportlist.sort() exportlist.sort()
@ -384,12 +384,16 @@ class DirectoryScan:
# meta_lines is just anything containing '# ba_meta '; make sure # meta_lines is just anything containing '# ba_meta '; make sure
# the ba_meta is in the right place. # the ba_meta is in the right place.
if mline[0] != 'ba_meta': if mline[0] != 'ba_meta':
logging.warning( # Make an exception for this specific file, otherwise we
'metascan: %s:%d: malformed ba_meta statement.', # get lots of warnings about ba_meta showing up in weird
subpath, # places here.
lindex + 1, if str(subpath) not in ('babase/_meta.py',):
) logging.warning(
self.results.announce_errors_occurred = True 'metascan: %s:%d: malformed ba_meta statement.',
subpath,
lindex + 1,
)
self.results.announce_errors_occurred = True
elif ( elif (
len(mline) == 4 and mline[1] == 'require' and mline[2] == 'api' len(mline) == 4 and mline[1] == 'require' and mline[2] == 'api'
): ):

View File

@ -93,7 +93,7 @@ class PluginSubsystem(AppSubsystem):
# that weren't covered by the meta stuff above, either creating # that weren't covered by the meta stuff above, either creating
# plugin-specs for them or clearing them out. This covers # plugin-specs for them or clearing them out. This covers
# plugins with api versions not matching ours, plugins without # plugins with api versions not matching ours, plugins without
# ba_meta tags, and plugins that have since disappeared. # ba_*meta tags, and plugins that have since disappeared.
assert isinstance(plugstates, dict) assert isinstance(plugstates, dict)
wrong_api_prefixes = [f'{m}.' for m in results.incorrect_api_modules] wrong_api_prefixes = [f'{m}.' for m in results.incorrect_api_modules]

View File

@ -28,6 +28,7 @@ if TYPE_CHECKING:
from bauiv1 import UIV1AppSubsystem, MainWindow, MainWindowState from bauiv1 import UIV1AppSubsystem, MainWindow, MainWindowState
# ba_meta export babase.AppMode
class ClassicAppMode(AppMode): class ClassicAppMode(AppMode):
"""AppMode for the classic BombSquad experience.""" """AppMode for the classic BombSquad experience."""
@ -156,7 +157,7 @@ class ClassicAppMode(AppMode):
"""Update subscriptions/etc. for a new primary account state.""" """Update subscriptions/etc. for a new primary account state."""
assert in_logic_thread() assert in_logic_thread()
if bool(False): if bool(True):
assert app.plus is not None assert app.plus is not None
if account is None: if account is None:
self._test_sub = None self._test_sub = None

View File

@ -53,7 +53,7 @@ if TYPE_CHECKING:
# Build number and version of the ballistica binary we expect to be # Build number and version of the ballistica binary we expect to be
# using. # using.
TARGET_BALLISTICA_BUILD = 22101 TARGET_BALLISTICA_BUILD = 22102
TARGET_BALLISTICA_VERSION = '1.7.37' TARGET_BALLISTICA_VERSION = '1.7.37'

View File

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

View File

@ -226,24 +226,27 @@ def generate_app_module(
keep_markers=True, keep_markers=True,
) )
contents = ( # Disabling this for now; will probably remove permanently. Testable
'# Return all our default_app_modes as testable.\n' # app mode discovery now uses meta discovery system.
"# (generated from 'default_app_modes' in projectconfig).\n" if bool(False):
) contents = (
for mode in default_app_modes: '# Return all our default_app_modes as testable.\n'
contents += f'import {_module_for_app_mode(mode)}\n' "# (generated from 'default_app_modes' in projectconfig).\n"
contents += '\n' )
contents += 'return [\n' for mode in default_app_modes:
for mode in default_app_modes: contents += f'import {_module_for_app_mode(mode)}\n'
contents += f' {mode},\n' contents += '\n'
contents += ']' contents += 'return [\n'
out = replace_section( for mode in default_app_modes:
out, contents += f' {mode},\n'
f'{indent}# __DEFAULT_TESTABLE_APP_MODES_BEGIN__\n', contents += ']'
f'{indent}# __DEFAULT_TESTABLE_APP_MODES_END__\n', out = replace_section(
textwrap.indent(f'{info}\n\n{contents}\n', indent), out,
keep_markers=True, f'{indent}# __DEFAULT_TESTABLE_APP_MODES_BEGIN__\n',
) f'{indent}# __DEFAULT_TESTABLE_APP_MODES_END__\n',
textwrap.indent(f'{info}\n\n{contents}\n', indent),
keep_markers=True,
)
# Note: we *should* format this string, but because this code # Note: we *should* format this string, but because this code
# runs with every project update I'm just gonna try to keep the # runs with every project update I'm just gonna try to keep the