diff --git a/.efrocachemap b/.efrocachemap index 55c03eff..9699d790 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -3995,26 +3995,26 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/d1/f8/b03601885097936dbf33beb9295b", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/73/f4/4b6a99f4bd16c57c12a6d9642610", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/72/66/e7f664a89f74873c295e4caa5600", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/64/53/7674f5e91e39d2a4f61bf337f75d", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8c/26/f5174bbbd4c0dd31f9dcd96ff73d", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/11/ba/9e76380beb4ac4b4138e4825a854", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c5/e5/a2f0f97514e9f021ef70bf4e5515", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/07/de/b8108b36ba1d0f56f2f4fca6a6a8", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/fd/cb/f395843e0c1dd2eef3a0f098494a", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/8a/e8/9a0f8609f41de40bc3fb992af56c", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/63/66/dcbc9e702844102bd6b34c4c1130", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d7/45/b7f5f7247a0f666af1980f74aedb", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f9/9a/699f6ec2b9a05ab3efcf26ae85e0", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/2f/6e/14a6c316296320c2276cadfb8c0c", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a5/61/d664c519465e432b193685adeb0e", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/75/65/c34d887d326a45b25228ef6de05c", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/86/ae/5ebc9448c0250247bbae922c642a", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/8c/3d/6f1d91d315c0748b92b3d51cfe93", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/38/77/56e7c9b43ce95a6f43ee15199c55", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/ca/b9/7635862e47d93e895047fa07caf5", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/06/3e/28bf1a2f2c8ff9d60dc9009afd43", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/32/6b/12db67765516b0205816b41db4b8", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/57/1e/0ba38a08a2ba605e4589c6422bc1", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0a/29/2965569534dfb27d9736be40a8ca", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/38/ab/f754bc432bfa15093d2d6c953c12", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/77/22/b49336253e7c20018aabfcbbda41", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/98/0f/6a0c5560b55ca824fd25cf6b356b", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9f/91/15b00e3fce05b0f10ea5af3d5ee2", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/12/d7/c074bdd761d329d75b1042d5167b", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/51/eb/1f61c50a9ebc93e0f856bbe1ef5e", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/62/f3/5d29f0c2f554ae5205d76cdb283e", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d2/90/0375524fe5f78555b9ff12b2601b", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/2b/cc/b45a0dcdda43cf719b6fd644c4c4", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/69/1c/10f4427b746cb6a2545290aa1f99", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/98/6e/65f75aeb62bdd6c897d163299c46", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0f/d0/ff714a43170a2c422d65b0533dca", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/40/d8/af1c5a8f4f2960596475ee11bbdd", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/33/73/7b039824562b5160fa03efdd1cc3", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/e4/dc/9bbf05c098bdc64a9b90f2580cdc", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/da/5e/91e6217194f56e7782bf7654af88", "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/14/ee/113076d5d2e088cc90230cf6ab51", "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7e/e4/38a2a67908a08aa068c4927d3122", "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/75/fd/6250319a816a7b312051bfc2a63f", @@ -4031,14 +4031,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/dd/d1/187a739cbbe0316fd809708fa9ee", "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/19/38/7a480d58b0ade7b5705f2f9474ee", "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e2/4b/524bed0bfca1b06a324163728fe1", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/17/30/080b63fe14e6f775d439c3256f54", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/02/a0/5498bc8c8c55ab7e7ebdd23402b5", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/7b/56/65a60485ae436ef86f8ccc8db7cf", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/83/93/bbaa2c5c664779c69cbfae1b8163", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/f1/1b/9eb27d7361d65dc0afbb26e74870", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/d2/6f/743f2f6e1ac49577900724cefe08", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/be/d2/64fbeeb285197fd410a92a35624e", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/5c/be/30aecc599f3c5977b40bd1155191", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/a6/36/5eacae1d7477be84c255960e1a10", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/9c/0f/9e9a95622f7ca0ec6315346517a5", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/ba/f6/ae4469f1b89aed5aca7b05711fb9", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/97/6f/c3ce83c00b3f1e74f26878756d89", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/6f/57/3e0af371b5fefb1a625a37b42f0d", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/ae/ad/375e1add60a59f6ca1a94fcea1ef", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/d4/03/4a9df83e96f11f2315e3ee0af9bd", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/e3/11/d0e5057f133014b787866b6d6f0f", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/7d/3e/229a581cb2454ed856f1d8b564a7", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/98/12/571b2160d69d42580e8f31fa6a8d" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c48ae977..7d60e6eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.7 (build 20770, api 7, 2022-09-05) +### 1.7.7 (build 20772, api 7, 2022-09-05) - Added `ba.app.meta.load_exported_classes()` for loading classes discovered by the meta subsystem cleanly in a background thread. - Improved logging of missing playlist game types. - Some ba.Lstr functionality can now be used in background threads. @@ -18,6 +18,7 @@ - Misc C++ layer tidying/refactoring. - Split out the `_ba` binary module into `_ba` and `_bainternal`. This will eventually allow running without the closed-source parts (_bainternal) present at all. - There is now a `_bainternal.py` dummy-module alongside the existing `_ba.py` one. Be sure to exclude it from any script collections used by the game (the same as `_ba.py`). +- Added checks to make sure _ba or _bainternal arent used outside of ba. Any 'internal' functionality needed outside of ba should be exposed through ba.internal. _ba and _bainternal are internal implementation details. ### 1.7.6 (build 20687, api 7, 2022-08-11) - Cleaned up da MetaSubsystem code. diff --git a/assets/src/ba_data/python/ba/__init__.py b/assets/src/ba_data/python/ba/__init__.py index 82df9420..4b06c0ed 100644 --- a/assets/src/ba_data/python/ba/__init__.py +++ b/assets/src/ba_data/python/ba/__init__.py @@ -17,7 +17,8 @@ from _ba import ( newnode, playsound, printnodes, printobjects, pushcall, quit, rowwidget, safecolor, screenmessage, scrollwidget, set_analytics_screen, charstr, textwidget, time, timer, open_url, widget, clipboard_is_supported, - clipboard_has_text, clipboard_get_text, clipboard_set_text, getdata) + clipboard_has_text, clipboard_get_text, clipboard_set_text, getdata, + in_logic_thread) from ba._activity import Activity from ba._plugin import PotentialPlugin, Plugin, PluginSubsystem from ba._actor import Actor @@ -99,8 +100,8 @@ __all__ = [ 'GameTip', 'garbage_collect', 'getactivity', 'getclass', 'getcollidemodel', 'getcollision', 'getdata', 'getmaps', 'getmodel', 'getnodes', 'getsession', 'getsound', 'gettexture', 'HitMessage', 'hscrollwidget', 'imagewidget', - 'ImpactDamageMessage', 'InputDevice', 'InputDeviceNotFoundError', - 'InputType', 'IntChoiceSetting', 'IntSetting', + 'ImpactDamageMessage', 'in_logic_thread', 'InputDevice', + 'InputDeviceNotFoundError', 'InputType', 'IntChoiceSetting', 'IntSetting', 'is_browser_likely_available', 'is_point_in_box', 'Keyboard', 'LanguageSubsystem', 'Level', 'Lobby', 'log', 'Lstr', 'Map', 'Material', 'MetadataSubsystem', 'Model', 'MultiTeamSession', 'MusicPlayer', diff --git a/assets/src/ba_data/python/ba/_bootstrap.py b/assets/src/ba_data/python/ba/_bootstrap.py index 4523417d..fa26006b 100644 --- a/assets/src/ba_data/python/ba/_bootstrap.py +++ b/assets/src/ba_data/python/ba/_bootstrap.py @@ -32,7 +32,7 @@ def bootstrap() -> None: # Give a soft warning if we're being used with a different binary # version than we expect. - expected_build = 20770 + expected_build = 20772 running_build: int = env['build_number'] if running_build != expected_build: print( diff --git a/assets/src/ba_data/python/ba/internal.py b/assets/src/ba_data/python/ba/internal.py index 7a02ecb6..d5b47820 100644 --- a/assets/src/ba_data/python/ba/internal.py +++ b/assets/src/ba_data/python/ba/internal.py @@ -8,6 +8,31 @@ defensively) in mods. """ from __future__ import annotations +from _ba import ( + get_scores_to_beat, show_online_score_ui, set_ui_input_device, + is_party_icon_visible, getinputdevice, add_clean_frame_callback, + unlock_all_input, increment_analytics_count, set_debug_speed_exponent, + get_special_widget, get_qrcode_texture, get_string_height, + get_string_width, show_app_invite, appnameupper, lock_all_input, + open_file_externally, fade_screen, appname, have_incentivized_ad, + has_video_ads, workspaces_in_use, set_party_icon_always_visible, + connect_to_party, get_game_port, end_host_scanning, host_scan_cycle, + charstr, get_public_party_enabled, get_public_party_max_size, + set_public_party_name, set_public_party_max_size, set_authenticate_clients, + set_public_party_enabled, reset_random_player_names, new_host_session, + get_foreground_host_session, get_local_active_input_devices_count, + get_ui_input_device, is_in_replay, set_replay_speed_exponent, + get_replay_speed_exponent, disconnect_from_host, set_party_window_open, + get_connection_to_host_info, get_chat_messages, get_game_roster, + disconnect_client, chatmessage, get_random_names, have_permission, + request_permission, have_touchscreen_input, is_xcode_build, + set_low_level_config_value, get_low_level_config_value, + capture_gamepad_input, release_gamepad_input, has_gamma_control, + get_max_graphics_quality, get_display_resolution, capture_keyboard_input, + release_keyboard_input, value_test, set_touchscreen_editing, + is_running_on_fire_tv, android_get_external_files_dir, + set_telnet_access_enabled, new_replay_session, get_replays_dir) + from ba._map import (get_map_class, register_map, preload_map_preview_media, get_map_display_string, get_filtered_map_name) from ba._appconfig import commit_app_config @@ -53,33 +78,156 @@ from ba._internal import ( sign_out_v1, sign_in_v1, mark_config_dirty) __all__ = [ - 'get_unowned_maps', 'get_unowned_game_types', 'get_map_class', - 'register_map', 'preload_map_preview_media', 'get_map_display_string', - 'get_filtered_map_name', 'commit_app_config', 'get_device_value', - 'get_input_map_hash', 'get_input_device_config', 'getclass', 'json_prep', - 'get_type_name', 'JoinActivity', 'ScoreScreenActivity', - 'is_browser_likely_available', 'get_remote_app_name', - 'should_submit_debug_info', 'run_gpu_benchmark', 'run_cpu_benchmark', - 'run_media_reload_benchmark', 'run_stress_test', 'getcampaign', - 'PlayerProfilesChangedMessage', 'DEFAULT_TEAM_COLORS', - 'DEFAULT_TEAM_NAMES', 'do_play_music', 'master_server_get', - 'master_server_post', 'get_ip_address_type', - 'DEFAULT_REQUEST_TIMEOUT_SECONDS', 'get_default_powerup_distribution', - 'get_player_profile_colors', 'get_player_profile_icon', - 'get_player_colors', 'get_next_tip', 'get_default_free_for_all_playlist', - 'get_default_teams_playlist', 'filter_playlist', 'get_available_sale_time', - 'get_available_purchase_count', 'get_store_item_name_translated', - 'get_store_item_display_size', 'get_store_layout', 'get_store_item', - 'get_clean_price', 'get_tournament_prize_strings', 'get_trophy_string', - 'get_v2_fleet', 'get_master_server_address', 'is_blessed', 'get_news_show', - 'game_service_has_leaderboard', 'report_achievement', 'submit_score', - 'tournament_query', 'power_ranking_query', 'restore_purchases', 'purchase', - 'get_purchases_state', 'get_purchased', 'get_price', 'in_game_purchase', - 'add_transaction', 'reset_achievements', 'get_public_login_id', - 'have_outstanding_transactions', 'run_transactions', - 'get_v1_account_misc_read_val', 'get_v1_account_misc_read_val_2', - 'get_v1_account_misc_val', 'get_v1_account_ticket_count', - 'get_v1_account_state_num', 'get_v1_account_state', - 'get_v1_account_display_string', 'get_v1_account_type', - 'get_v1_account_name', 'sign_out_v1', 'sign_in_v1', 'mark_config_dirty' + 'get_scores_to_beat', + 'show_online_score_ui', + 'set_ui_input_device', + 'is_party_icon_visible', + 'getinputdevice', + 'add_clean_frame_callback', + 'unlock_all_input', + 'increment_analytics_count', + 'set_debug_speed_exponent', + 'get_special_widget', + 'get_qrcode_texture', + 'get_string_height', + 'get_string_width', + 'show_app_invite', + 'appnameupper', + 'lock_all_input', + 'open_file_externally', + 'fade_screen', + 'appname', + 'have_incentivized_ad', + 'has_video_ads', + 'workspaces_in_use', + 'set_party_icon_always_visible', + 'connect_to_party', + 'get_game_port', + 'end_host_scanning', + 'host_scan_cycle', + 'charstr', + 'get_public_party_enabled', + 'get_public_party_max_size', + 'set_public_party_name', + 'set_public_party_max_size', + 'set_authenticate_clients', + 'set_public_party_enabled', + 'reset_random_player_names', + 'new_host_session', + 'get_foreground_host_session', + 'get_local_active_input_devices_count', + 'get_ui_input_device', + 'is_in_replay', + 'set_replay_speed_exponent', + 'get_replay_speed_exponent', + 'disconnect_from_host', + 'set_party_window_open', + 'get_connection_to_host_info', + 'get_chat_messages', + 'get_game_roster', + 'disconnect_client', + 'chatmessage', + 'get_random_names', + 'have_permission', + 'request_permission', + 'have_touchscreen_input', + 'is_xcode_build', + 'set_low_level_config_value', + 'get_low_level_config_value', + 'capture_gamepad_input', + 'release_gamepad_input', + 'has_gamma_control', + 'get_max_graphics_quality', + 'get_display_resolution', + 'capture_keyboard_input', + 'release_keyboard_input', + 'value_test', + 'set_touchscreen_editing', + 'is_running_on_fire_tv', + 'android_get_external_files_dir', + 'set_telnet_access_enabled', + 'new_replay_session', + 'get_replays_dir', + # DIVIDER + 'get_unowned_maps', + 'get_unowned_game_types', + 'get_map_class', + 'register_map', + 'preload_map_preview_media', + 'get_map_display_string', + 'get_filtered_map_name', + 'commit_app_config', + 'get_device_value', + 'get_input_map_hash', + 'get_input_device_config', + 'getclass', + 'json_prep', + 'get_type_name', + 'JoinActivity', + 'ScoreScreenActivity', + 'is_browser_likely_available', + 'get_remote_app_name', + 'should_submit_debug_info', + 'run_gpu_benchmark', + 'run_cpu_benchmark', + 'run_media_reload_benchmark', + 'run_stress_test', + 'getcampaign', + 'PlayerProfilesChangedMessage', + 'DEFAULT_TEAM_COLORS', + 'DEFAULT_TEAM_NAMES', + 'do_play_music', + 'master_server_get', + 'master_server_post', + 'get_ip_address_type', + 'DEFAULT_REQUEST_TIMEOUT_SECONDS', + 'get_default_powerup_distribution', + 'get_player_profile_colors', + 'get_player_profile_icon', + 'get_player_colors', + 'get_next_tip', + 'get_default_free_for_all_playlist', + 'get_default_teams_playlist', + 'filter_playlist', + 'get_available_sale_time', + 'get_available_purchase_count', + 'get_store_item_name_translated', + 'get_store_item_display_size', + 'get_store_layout', + 'get_store_item', + 'get_clean_price', + 'get_tournament_prize_strings', + 'get_trophy_string', + 'get_v2_fleet', + 'get_master_server_address', + 'is_blessed', + 'get_news_show', + 'game_service_has_leaderboard', + 'report_achievement', + 'submit_score', + 'tournament_query', + 'power_ranking_query', + 'restore_purchases', + 'purchase', + 'get_purchases_state', + 'get_purchased', + 'get_price', + 'in_game_purchase', + 'add_transaction', + 'reset_achievements', + 'get_public_login_id', + 'have_outstanding_transactions', + 'run_transactions', + 'get_v1_account_misc_read_val', + 'get_v1_account_misc_read_val_2', + 'get_v1_account_misc_val', + 'get_v1_account_ticket_count', + 'get_v1_account_state_num', + 'get_v1_account_state', + 'get_v1_account_display_string', + 'get_v1_account_type', + 'get_v1_account_name', + 'sign_out_v1', + 'sign_in_v1', + 'mark_config_dirty', ] diff --git a/assets/src/ba_data/python/bastd/activity/coopjoin.py b/assets/src/ba_data/python/bastd/activity/coopjoin.py index 1d1db171..3e60af76 100644 --- a/assets/src/ba_data/python/bastd/activity/coopjoin.py +++ b/assets/src/ba_data/python/bastd/activity/coopjoin.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba from ba.internal import JoinActivity @@ -32,8 +31,9 @@ class CoopJoinActivity(JoinActivity): config_str = ('1p' + session.campaign.getlevel( session.campaign_level_name).get_score_version_string().replace( ' ', '_')) - _ba.get_scores_to_beat(level_name_full, config_str, - ba.WeakCall(self._on_got_scores_to_beat)) + ba.internal.get_scores_to_beat( + level_name_full, config_str, + ba.WeakCall(self._on_got_scores_to_beat)) def on_transition_in(self) -> None: from bastd.actor.controlsguide import ControlsGuide diff --git a/assets/src/ba_data/python/bastd/activity/coopscore.py b/assets/src/ba_data/python/bastd/activity/coopscore.py index 7baf547b..5e71b055 100644 --- a/assets/src/ba_data/python/bastd/activity/coopscore.py +++ b/assets/src/ba_data/python/bastd/activity/coopscore.py @@ -8,7 +8,6 @@ from __future__ import annotations import random from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.actor.text import Text @@ -265,12 +264,12 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): self.end({'outcome': 'next_level'}) def _ui_gc(self) -> None: - _ba.show_online_score_ui('leaderboard', - game=self._game_name_str, - game_version=self._game_config_str) + ba.internal.show_online_score_ui('leaderboard', + game=self._game_name_str, + game_version=self._game_config_str) def _ui_show_achievements(self) -> None: - _ba.show_online_score_ui('achievements') + ba.internal.show_online_score_ui('achievements') def _ui_worlds_best(self) -> None: if self._score_link is None: @@ -332,7 +331,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): # to the game (like on mac). can_select_extra_buttons = ba.app.platform == 'android' - _ba.set_ui_input_device(None) # Menu is up for grabs. + ba.internal.set_ui_input_device(None) # Menu is up for grabs. if self._show_friend_scores: ba.buttonwidget(parent=rootc, @@ -484,7 +483,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): timetype=ba.TimeType.REAL) def _update_corner_button_positions(self) -> None: - offs = -55 if _ba.is_party_icon_visible() else 0 + offs = -55 if ba.internal.is_party_icon_visible() else 0 assert self._corner_button_offs is not None pos_x = self._corner_button_offs[0] + offs pos_y = self._corner_button_offs[1] @@ -498,9 +497,9 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): # If this activity is a good 'end point', ask server-mode just once if # it wants to do anything special like switch sessions or kill the app. - if (self._allow_server_transition and _ba.app.server is not None + if (self._allow_server_transition and ba.app.server is not None and self._server_transitioning is None): - self._server_transitioning = _ba.app.server.handle_transition() + self._server_transitioning = ba.app.server.handle_transition() assert isinstance(self._server_transitioning, bool) # If server-mode is handling this, don't do anything ourself. @@ -529,7 +528,7 @@ class CoopScoreScreen(ba.Activity[ba.Player, ba.Team]): if ba.app.server is not None: # Host can't press retry button, so anyone can do it instead. time_till_assign = max( - 0, self._birth_time + self._min_view_time - _ba.time()) + 0, self._birth_time + self._min_view_time - ba.time()) ba.timer(time_till_assign, ba.WeakCall(self._safe_assign, player)) diff --git a/assets/src/ba_data/python/bastd/actor/controlsguide.py b/assets/src/ba_data/python/bastd/actor/controlsguide.py index 92a11159..40e82f67 100644 --- a/assets/src/ba_data/python/bastd/actor/controlsguide.py +++ b/assets/src/ba_data/python/bastd/actor/controlsguide.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Sequence @@ -317,9 +317,8 @@ class ControlsGuide(ba.Actor): # an input device that is *not* the touchscreen. # (otherwise it is confusing to see the touchscreen buttons right # next to our display buttons) - touchscreen: ba.InputDevice | None = _ba.getinputdevice('TouchScreen', - '#1', - doraise=False) + touchscreen: ba.InputDevice | None = ba.internal.getinputdevice( + 'TouchScreen', '#1', doraise=False) if touchscreen is not None: # We look at the session's players; not the activity's. @@ -385,7 +384,7 @@ class ControlsGuide(ba.Actor): # If there's no players with input devices yet, try to default to # showing keyboard controls. if not input_devices: - kbd = _ba.getinputdevice('Keyboard', '#1', doraise=False) + kbd = ba.internal.getinputdevice('Keyboard', '#1', doraise=False) if kbd is not None: input_devices.append(kbd) diff --git a/assets/src/ba_data/python/bastd/mainmenu.py b/assets/src/ba_data/python/bastd/mainmenu.py index eb2d1bc0..ed695c0b 100644 --- a/assets/src/ba_data/python/bastd/mainmenu.py +++ b/assets/src/ba_data/python/bastd/mainmenu.py @@ -11,7 +11,6 @@ from typing import TYPE_CHECKING import ba import ba.internal -import _ba if TYPE_CHECKING: from typing import Any @@ -253,7 +252,7 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]): self._update() # Hopefully this won't hitch but lets space these out anyway. - _ba.add_clean_frame_callback(ba.WeakCall(self._start_preloads)) + ba.internal.add_clean_frame_callback(ba.WeakCall(self._start_preloads)) random.seed() @@ -937,7 +936,7 @@ class MainMenuSession(ba.Session): def on_activity_end(self, activity: ba.Activity, results: Any) -> None: if self._locked: - _ba.unlock_all_input() + ba.internal.unlock_all_input() # Any ending activity leads us into the main menu one. self.setactivity(ba.newactivity(MainMenuActivity)) diff --git a/assets/src/ba_data/python/bastd/tutorial.py b/assets/src/ba_data/python/bastd/tutorial.py index 0cb2c7b5..c92aed86 100644 --- a/assets/src/ba_data/python/bastd/tutorial.py +++ b/assets/src/ba_data/python/bastd/tutorial.py @@ -18,8 +18,8 @@ from __future__ import annotations import math from typing import TYPE_CHECKING -import _ba import ba +import ba.internal from bastd.actor import spaz as basespaz if TYPE_CHECKING: @@ -235,7 +235,7 @@ class TutorialActivity(ba.Activity[Player, Team]): super().on_begin() ba.set_analytics_screen('Tutorial Start') - _ba.increment_analytics_count('Tutorial start') + ba.internal.increment_analytics_count('Tutorial start') if bool(False): # Buttons on top. @@ -461,7 +461,7 @@ class TutorialActivity(ba.Activity[Player, Team]): def run(self, a: TutorialActivity) -> None: print('setting to', self._speed) - _ba.set_debug_speed_exponent(self._speed) + ba.internal.set_debug_speed_exponent(self._speed) class RemoveGloves: @@ -609,7 +609,7 @@ class TutorialActivity(ba.Activity[Player, Team]): pass def run(self, a: TutorialActivity) -> None: - _ba.increment_analytics_count('Tutorial finish') + ba.internal.increment_analytics_count('Tutorial finish') a.end() class Move: @@ -2328,7 +2328,7 @@ class TutorialActivity(ba.Activity[Player, Team]): ('${TOTAL}', str(len(self.players)))]) if count > 0 else '' if (count >= len(self.players) and self.players and not self._have_skipped): - _ba.increment_analytics_count('Tutorial skip') + ba.internal.increment_analytics_count('Tutorial skip') ba.set_analytics_screen('Tutorial Skip') self._have_skipped = True ba.playsound(ba.getsound('swish')) diff --git a/assets/src/ba_data/python/bastd/ui/account/settings.py b/assets/src/ba_data/python/bastd/ui/account/settings.py index 1c78f6ab..2c782b0a 100644 --- a/assets/src/ba_data/python/bastd/ui/account/settings.py +++ b/assets/src/ba_data/python/bastd/ui/account/settings.py @@ -8,7 +8,6 @@ from __future__ import annotations import time from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -379,7 +378,7 @@ class AccountSettingsWindow(ba.Window): self._account_name_text = None if self._back_button is None: - bbtn = _ba.get_special_widget('back_button') + bbtn = ba.internal.get_special_widget('back_button') else: bbtn = self._back_button @@ -447,7 +446,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) ba.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -472,7 +472,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) ba.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -517,7 +518,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) ba.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -563,7 +565,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) ba.widget(edit=btn, show_buffer_bottom=40, show_buffer_top=100) self._sign_in_text = None @@ -585,7 +588,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=0) # the button to go to OS-Specific leaderboards/high-score-lists/etc. @@ -606,14 +610,15 @@ class AccountSettingsWindow(ba.Window): color=(0.55, 0.5, 0.6), textcolor=(0.75, 0.7, 0.8), autoselect=True, - on_activate_call=_ba.show_online_score_ui, + on_activate_call=ba.internal.show_online_score_ui, size=(button_width, 50), label=account_type_name) if first_selectable is None: first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) v -= game_service_button_space * 0.15 else: @@ -655,7 +660,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) v -= achievements_button_space * 0.15 else: @@ -683,7 +689,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) v -= leaderboards_button_space * 0.15 else: @@ -753,7 +760,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn) self._linked_accounts_text: ba.Widget | None @@ -808,7 +816,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=50) self._unlink_accounts_button: ba.Widget | None @@ -836,7 +845,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=50) self._update_unlink_accounts_button() else: @@ -857,7 +867,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=15) if show_cancel_v2_sign_in_button: @@ -875,7 +886,8 @@ class AccountSettingsWindow(ba.Window): first_selectable = btn if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, left_widget=bbtn, show_buffer_bottom=15) # Whatever the topmost selectable thing is, we want it to scroll all @@ -898,7 +910,7 @@ class AccountSettingsWindow(ba.Window): # for google play we use the built-in UI; otherwise pop up our own if account_type == 'Google Play': ba.timer(0.15, - ba.Call(_ba.show_online_score_ui, 'achievements'), + ba.Call(ba.internal.show_online_score_ui, 'achievements'), timetype=ba.TimeType.REAL) elif account_type != 'unknown': assert self._achievements_button is not None @@ -910,7 +922,7 @@ class AccountSettingsWindow(ba.Window): def _on_leaderboards_press(self) -> None: ba.timer(0.15, - ba.Call(_ba.show_online_score_ui, 'leaderboards'), + ba.Call(ba.internal.show_online_score_ui, 'leaderboards'), timetype=ba.TimeType.REAL) def _have_unlinkable_accounts(self) -> bool: diff --git a/assets/src/ba_data/python/bastd/ui/account/v2.py b/assets/src/ba_data/python/bastd/ui/account/v2.py index e240264d..38047c23 100644 --- a/assets/src/ba_data/python/bastd/ui/account/v2.py +++ b/assets/src/ba_data/python/bastd/ui/account/v2.py @@ -9,7 +9,6 @@ from typing import TYPE_CHECKING import ba import ba.internal -import _ba from efro.error import CommunicationError import bacommon.cloud @@ -125,7 +124,7 @@ class V2SignInWindow(ba.Window): position=(self._width * 0.5 - qr_size * 0.5, self._height * 0.36 + qroffs - qr_size * 0.5), size=(qr_size, qr_size), - texture=_ba.get_qrcode_texture(address)) + texture=ba.internal.get_qrcode_texture(address)) # Start querying for results. self._proxyid = response.proxyid diff --git a/assets/src/ba_data/python/bastd/ui/account/viewer.py b/assets/src/ba_data/python/bastd/ui/account/viewer.py index feefea8f..d62848f6 100644 --- a/assets/src/ba_data/python/bastd/ui/account/viewer.py +++ b/assets/src/ba_data/python/bastd/ui/account/viewer.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui import popup @@ -199,8 +198,8 @@ class AccountViewerWindow(popup.PopupWindow): ba.print_exception('Error displaying trophies.') account_name_spacing = 15 tscale = 0.65 - ts_height = _ba.get_string_height(trophystr, - suppress_warning=True) + ts_height = ba.internal.get_string_height( + trophystr, suppress_warning=True) sub_width = self._width - 80 sub_height = 200 + ts_height * tscale + \ account_name_spacing * len(data['accountDisplayStrings']) @@ -323,8 +322,8 @@ class AccountViewerWindow(popup.PopupWindow): ('${SUFFIX}', '')]).evaluate() rank_str_width = min( sub_width * maxwidth_scale, - _ba.get_string_width(rank_str, suppress_warning=True) * - 0.55) + ba.internal.get_string_width( + rank_str, suppress_warning=True) * 0.55) # Only tack our suffix on if its at the end and only for # non-diamond leagues. @@ -376,8 +375,8 @@ class AccountViewerWindow(popup.PopupWindow): ]).evaluate() rank_str_width = min( sub_width * maxwidth_scale, - _ba.get_string_width(rank_str, suppress_warning=True) * - 0.3) + ba.internal.get_string_width( + rank_str, suppress_warning=True) * 0.3) # Only tack our suffix on if its at the end and only for # non-diamond leagues. diff --git a/assets/src/ba_data/python/bastd/ui/appinvite.py b/assets/src/ba_data/python/bastd/ui/appinvite.py index c266b2b5..176be36c 100644 --- a/assets/src/ba_data/python/bastd/ui/appinvite.py +++ b/assets/src/ba_data/python/bastd/ui/appinvite.py @@ -8,7 +8,6 @@ import copy import time from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -131,7 +130,7 @@ class AppInviteWindow(ba.Window): if ba.internal.get_v1_account_state() == 'signed_in': ba.set_analytics_screen('App Invite UI') - _ba.show_app_invite( + ba.internal.show_app_invite( ba.Lstr(resource='gatherWindow.appInviteTitleText', subs=[('${APP_NAME}', ba.Lstr(resource='titleText')) ]).evaluate(), @@ -251,7 +250,7 @@ class ShowFriendCodeWindow(ba.Window): def _google_invites(self) -> None: ba.set_analytics_screen('App Invite UI') - _ba.show_app_invite( + ba.internal.show_app_invite( ba.Lstr(resource='gatherWindow.appInviteTitleText', subs=[('${APP_NAME}', ba.Lstr(resource='titleText')) ]).evaluate(), diff --git a/assets/src/ba_data/python/bastd/ui/configerror.py b/assets/src/ba_data/python/bastd/ui/configerror.py index b94c5800..26ffdf6f 100644 --- a/assets/src/ba_data/python/bastd/ui/configerror.py +++ b/assets/src/ba_data/python/bastd/ui/configerror.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -29,7 +29,7 @@ class ConfigErrorWindow(ba.Window): h_align='center', v_align='top', scale=0.73, - text=(f'Error reading {_ba.appnameupper()} config file' + text=(f'Error reading {ba.internal.appnameupper()} config file' ':\n\n\nCheck the console' ' (press ~ twice) for details.\n\nWould you like to quit and' ' try to fix it by hand\nor overwrite it with defaults?\n\n' @@ -58,10 +58,10 @@ class ConfigErrorWindow(ba.Window): def _quit(self) -> None: ba.timer(0.001, self._edit_and_quit, timetype=ba.TimeType.REAL) - _ba.lock_all_input() + ba.internal.lock_all_input() def _edit_and_quit(self) -> None: - _ba.open_file_externally(self._config_file_path) + ba.internal.open_file_externally(self._config_file_path) ba.timer(0.1, ba.quit, timetype=ba.TimeType.REAL) def _defaults(self) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/confirm.py b/assets/src/ba_data/python/bastd/ui/confirm.py index 11c76d96..46bb90bf 100644 --- a/assets/src/ba_data/python/bastd/ui/confirm.py +++ b/assets/src/ba_data/python/bastd/ui/confirm.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -54,7 +54,7 @@ class ConfirmWindow: size=(width, height), transition=transition, toolbar_visibility='menu_minimal_no_back', - parent=_ba.get_special_widget('overlay_stack'), + parent=ba.internal.get_special_widget('overlay_stack'), scale=(2.1 if uiscale is ba.UIScale.SMALL else 1.5 if uiscale is ba.UIScale.MEDIUM else 1.0), scale_origin_stack_offset=scale_origin) @@ -147,12 +147,13 @@ class QuitWindow: origin_widget=origin_widget).root_widget) def _fade_and_quit(self) -> None: - _ba.fade_screen(False, - time=0.2, - endcall=lambda: ba.quit(soft=True, back=self._back)) - _ba.lock_all_input() + ba.internal.fade_screen( + False, + time=0.2, + endcall=lambda: ba.quit(soft=True, back=self._back)) + ba.internal.lock_all_input() # Unlock and fade back in shortly.. just in case something goes wrong # (or on android where quit just backs out of our activity and # we may come back) - ba.timer(0.3, _ba.unlock_all_input, timetype=ba.TimeType.REAL) + ba.timer(0.3, ba.internal.unlock_all_input, timetype=ba.TimeType.REAL) diff --git a/assets/src/ba_data/python/bastd/ui/continues.py b/assets/src/ba_data/python/bastd/ui/continues.py index 4f907f02..85e9b7ba 100644 --- a/assets/src/ba_data/python/bastd/ui/continues.py +++ b/assets/src/ba_data/python/bastd/ui/continues.py @@ -7,7 +7,6 @@ from __future__ import annotations import weakref from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -38,11 +37,14 @@ class ContinuesWindow(ba.Window): txt = (ba.Lstr( resource='continuePurchaseText').evaluate().split('${PRICE}')) t_left = txt[0] - t_left_width = _ba.get_string_width(t_left, suppress_warning=True) + t_left_width = ba.internal.get_string_width(t_left, + suppress_warning=True) t_price = ba.charstr(ba.SpecialChar.TICKET) + str(self._cost) - t_price_width = _ba.get_string_width(t_price, suppress_warning=True) + t_price_width = ba.internal.get_string_width(t_price, + suppress_warning=True) t_right = txt[-1] - t_right_width = _ba.get_string_width(t_right, suppress_warning=True) + t_right_width = ba.internal.get_string_width(t_right, + suppress_warning=True) width_total_half = (t_left_width + t_price_width + t_right_width) * 0.5 ba.textwidget(parent=self._root_widget, diff --git a/assets/src/ba_data/python/bastd/ui/coop/browser.py b/assets/src/ba_data/python/bastd/ui/coop/browser.py index 70f5dbf7..b6d978d3 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/browser.py +++ b/assets/src/ba_data/python/bastd/ui/coop/browser.py @@ -8,7 +8,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui.store.button import StoreButton @@ -27,7 +26,7 @@ class CoopBrowserWindow(ba.Window): def _update_corner_button_positions(self) -> None: uiscale = ba.app.ui.uiscale offs = (-55 if uiscale is ba.UIScale.SMALL - and _ba.is_party_icon_visible() else 0) + and ba.internal.is_party_icon_visible() else 0) if self._league_rank_button is not None: self._league_rank_button.set_position( (self._width - 282 + offs - self._x_inset, self._height - 85 - @@ -55,7 +54,7 @@ class CoopBrowserWindow(ba.Window): # Quick note to players that tourneys won't work in ballistica # core builds. (need to split the word so it won't get subbed out) - if 'ballistica' + 'core' == _ba.appname(): + if 'ballistica' + 'core' == ba.internal.appname(): ba.timer(1.0, lambda: ba.screenmessage( ba.Lstr(resource='noTournamentsInTestBuildText'), @@ -334,7 +333,7 @@ class CoopBrowserWindow(ba.Window): ) # Decrement time on our tournament buttons. - ads_enabled = _ba.have_incentivized_ad() + ads_enabled = ba.internal.have_incentivized_ad() for tbtn in self._tournament_buttons: tbtn.time_remaining = max(0, tbtn.time_remaining - 1) if tbtn.time_remaining_value_text is not None: @@ -347,7 +346,7 @@ class CoopBrowserWindow(ba.Window): and self._tourney_data_up_to_date) else '-') # Also adjust the ad icon visibility. - if tbtn.allow_ads and _ba.has_video_ads(): + if tbtn.allow_ads and ba.internal.has_video_ads(): ba.imagewidget(edit=tbtn.entry_fee_ad_image, opacity=1.0 if ads_enabled else 0.25) ba.textwidget(edit=tbtn.entry_fee_text_remaining, @@ -637,7 +636,7 @@ class CoopBrowserWindow(ba.Window): # FIXME shouldn't use hard-coded strings here. txt = ba.Lstr(resource='tournamentsText', fallback_resource='tournamentText').evaluate() - t_width = _ba.get_string_width(txt, suppress_warning=True) + t_width = ba.internal.get_string_width(txt, suppress_warning=True) ba.textwidget(parent=w_parent, position=(h_base + 27, v + 30), size=(0, 0), @@ -941,7 +940,7 @@ class CoopBrowserWindow(ba.Window): show_sign_in_prompt() return - if _ba.workspaces_in_use(): + if ba.internal.workspaces_in_use(): ba.screenmessage( ba.Lstr(resource='tournamentsDisabledWorkspaceText'), color=(1, 0, 0)) diff --git a/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py b/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py index a78c3f71..041b6c5b 100644 --- a/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py +++ b/assets/src/ba_data/python/bastd/ui/coop/tournamentbutton.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING import copy import ba -import _ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -519,8 +519,8 @@ class TournamentButton: # Now, if this fee allows ads and we support video ads, show # the 'or ad' version. - if allow_ads and _ba.has_video_ads(): - ads_enabled = _ba.have_incentivized_ad() + if allow_ads and ba.internal.has_video_ads(): + ads_enabled = ba.internal.have_incentivized_ad() ba.imagewidget(edit=self.entry_fee_ad_image, opacity=1.0 if ads_enabled else 0.25) or_text = ba.Lstr(resource='orText', diff --git a/assets/src/ba_data/python/bastd/ui/creditslist.py b/assets/src/ba_data/python/bastd/ui/creditslist.py index 9176066c..7400005a 100644 --- a/assets/src/ba_data/python/bastd/ui/creditslist.py +++ b/assets/src/ba_data/python/bastd/ui/creditslist.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Sequence @@ -91,17 +91,19 @@ class CreditsListWindow(ba.Window): capture_arrows=True) if ba.app.ui.use_toolbars: - ba.widget(edit=scroll, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=scroll, + right_widget=ba.internal.get_special_widget('party_button')) if uiscale is ba.UIScale.SMALL: - ba.widget(edit=scroll, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=scroll, + left_widget=ba.internal.get_special_widget('back_button')) def _format_names(names2: Sequence[str], inset: float) -> str: sval = '' # measure a series since there's overlaps and stuff.. - space_width = _ba.get_string_width(' ' * 10, - suppress_warning=True) / 10.0 + space_width = ba.internal.get_string_width( + ' ' * 10, suppress_warning=True) / 10.0 spacing = 330.0 col1 = inset col2 = col1 + spacing @@ -124,7 +126,8 @@ class CreditsListWindow(ba.Window): spacingstr = ' ' * int((target - line_width) / space_width) nline += spacingstr nline += name - line_width = _ba.get_string_width(nline, suppress_warning=True) + line_width = ba.internal.get_string_width( + nline, suppress_warning=True) if nline != '': sval += nline + '\n' return sval diff --git a/assets/src/ba_data/python/bastd/ui/feedback.py b/assets/src/ba_data/python/bastd/ui/feedback.py index 92a4954c..c4b46654 100644 --- a/assets/src/ba_data/python/bastd/ui/feedback.py +++ b/assets/src/ba_data/python/bastd/ui/feedback.py @@ -7,6 +7,7 @@ from __future__ import annotations from typing import TYPE_CHECKING import ba +import ba.internal if TYPE_CHECKING: pass @@ -54,9 +55,8 @@ def ask_for_rating() -> ba.Widget | None: v_align='center') def do_rating() -> None: - import _ba if platform == 'android': - appname = _ba.appname() + appname = ba.internal.appname() if subplatform == 'google': url = f'market://details?id=net.froemling.{appname}' else: diff --git a/assets/src/ba_data/python/bastd/ui/fileselector.py b/assets/src/ba_data/python/bastd/ui/fileselector.py index bb6dc653..1f0963e4 100644 --- a/assets/src/ba_data/python/bastd/ui/fileselector.py +++ b/assets/src/ba_data/python/bastd/ui/fileselector.py @@ -9,8 +9,8 @@ import threading import time from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable, Sequence @@ -242,7 +242,7 @@ class FileSelectorWindow(ba.Window): max_str_width = 300.0 str_width = min( max_str_width, - _ba.get_string_width(folder_name, suppress_warning=True)) + ba.internal.get_string_width(folder_name, suppress_warning=True)) ba.textwidget(edit=self._path_text, text=folder_name, maxwidth=max_str_width) diff --git a/assets/src/ba_data/python/bastd/ui/gather/__init__.py b/assets/src/ba_data/python/bastd/ui/gather/__init__.py index d575f5df..70513930 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/__init__.py +++ b/assets/src/ba_data/python/bastd/ui/gather/__init__.py @@ -8,7 +8,6 @@ import weakref from enum import Enum from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui.tabs import TabRow @@ -89,7 +88,7 @@ class GatherWindow(ba.Window): self._transition_out = 'out_right' scale_origin = None ba.app.ui.set_main_menu_location('Gather') - _ba.set_party_icon_always_visible(True) + ba.internal.set_party_icon_always_visible(True) uiscale = ba.app.ui.uiscale self._width = 1240 if uiscale is ba.UIScale.SMALL else 1040 x_offs = 100 if uiscale is ba.UIScale.SMALL else 0 @@ -188,11 +187,13 @@ class GatherWindow(ba.Window): self._tabs[tab_id] = tabtype(self) if ba.app.ui.use_toolbars: - ba.widget(edit=self._tab_row.tabs[tabdefs[-1][0]].button, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=self._tab_row.tabs[tabdefs[-1][0]].button, + right_widget=ba.internal.get_special_widget('party_button')) if uiscale is ba.UIScale.SMALL: - ba.widget(edit=self._tab_row.tabs[tabdefs[0][0]].button, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=self._tab_row.tabs[tabdefs[0][0]].button, + left_widget=ba.internal.get_special_widget('back_button')) self._scroll_width = self._width - scroll_buffer_h self._scroll_height = self._height - 180.0 + tabs_top_extra @@ -216,7 +217,7 @@ class GatherWindow(ba.Window): self._restore_state() def __del__(self) -> None: - _ba.set_party_icon_always_visible(False) + ba.internal.set_party_icon_always_visible(False) def playlist_select(self, origin_widget: ba.Widget) -> None: """Called by the private-hosting tab to select a playlist.""" diff --git a/assets/src/ba_data/python/bastd/ui/gather/manualtab.py b/assets/src/ba_data/python/bastd/ui/gather/manualtab.py index 0ca61507..0fa1a7b6 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/manualtab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/manualtab.py @@ -11,8 +11,8 @@ from enum import Enum from dataclasses import dataclass from bastd.ui.gather import GatherTab -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -341,8 +341,9 @@ class ManualGatherTab(GatherTab): label=ba.Lstr(resource='gatherWindow.manualConnectText'), autoselect=True) if uiscale is ba.UIScale.SMALL and ba.app.ui.use_toolbars: - ba.widget(edit=btn1, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=btn1, + left_widget=ba.internal.get_special_widget('back_button')) btnv -= b_height + b_space_extra ba.buttonwidget(parent=self._container, size=(b_width, b_height), @@ -686,7 +687,7 @@ class ManualGatherTab(GatherTab): config = ba.app.config config['Last Manual Party Connect Address'] = resolved_address config.commit() - _ba.connect_to_party(resolved_address, port=port) + ba.internal.connect_to_party(resolved_address, port=port) def _run_addr_fetch(self) -> None: try: @@ -894,9 +895,12 @@ class ManualGatherTab(GatherTab): if t_accessible_extra: ba.textwidget( edit=t_accessible_extra, - text=ba.Lstr(resource='gatherWindow.' - 'manualRouterForwardingText', - subs=[('${PORT}', - str(_ba.get_game_port()))]), + text=ba.Lstr( + resource='gatherWindow.' + 'manualRouterForwardingText', + subs=[ + ('${PORT}', str(ba.internal.get_game_port())), + ], + ), color=color_bad, ) diff --git a/assets/src/ba_data/python/bastd/ui/gather/nearbytab.py b/assets/src/ba_data/python/bastd/ui/gather/nearbytab.py index 4622d5ad..c5ebcdd6 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/nearbytab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/nearbytab.py @@ -8,7 +8,7 @@ import weakref from typing import TYPE_CHECKING import ba -import _ba +import ba.internal from bastd.ui.gather import GatherTab if TYPE_CHECKING: @@ -42,13 +42,13 @@ class NetScanner: ba.timer(0.25, ba.WeakCall(self.update), timetype=ba.TimeType.REAL) def __del__(self) -> None: - _ba.end_host_scanning() + ba.internal.end_host_scanning() def _on_select(self, host: dict[str, Any]) -> None: self._last_selected_host = host def _on_activate(self, host: dict[str, Any]) -> None: - _ba.connect_to_party(host['address']) + ba.internal.connect_to_party(host['address']) def update(self) -> None: """(internal)""" @@ -65,7 +65,7 @@ class NetScanner: # Grab this now this since adding widgets will change it. last_selected_host = self._last_selected_host - hosts = _ba.host_scan_cycle() + hosts = ba.internal.host_scan_cycle() for i, host in enumerate(hosts): txt3 = ba.textwidget(parent=self._columnwidget, size=(self._width / t_scale, 30), diff --git a/assets/src/ba_data/python/bastd/ui/gather/privatetab.py b/assets/src/ba_data/python/bastd/ui/gather/privatetab.py index 294f0a5a..3f7dcf1e 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/privatetab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/privatetab.py @@ -11,12 +11,11 @@ from enum import Enum from dataclasses import dataclass from typing import TYPE_CHECKING, cast -import ba -import ba.internal -import _ba from efro.dataclassio import dataclass_from_dict, dataclass_to_dict from bacommon.net import (PrivateHostingState, PrivateHostingConfig, PrivatePartyConnectResult) +import ba +import ba.internal from bastd.ui.gather import GatherTab from bastd.ui import getcurrency @@ -705,7 +704,7 @@ class PrivateGatherTab(GatherTab): btnlabel = ba.Lstr( resource='gatherWindow.hostingUnavailableText') elif self._hostingstate.party_code is None: - ticon = _ba.charstr(ba.SpecialChar.TICKET) + ticon = ba.internal.charstr(ba.SpecialChar.TICKET) nowtickets = self._hostingstate.tickets_to_host_now if nowtickets > 0: btnlabel = ba.Lstr( @@ -863,7 +862,7 @@ class PrivateGatherTab(GatherTab): return self._debug_server_comm('got valid connect response') assert cresult.addr is not None and cresult.port is not None - _ba.connect_to_party(cresult.addr, port=cresult.port) + ba.internal.connect_to_party(cresult.addr, port=cresult.port) except Exception: self._debug_server_comm('got connect response error') ba.playsound(ba.getsound('error')) diff --git a/assets/src/ba_data/python/bastd/ui/gather/publictab.py b/assets/src/ba_data/python/bastd/ui/gather/publictab.py index 88b55ab3..522c9e35 100644 --- a/assets/src/ba_data/python/bastd/ui/gather/publictab.py +++ b/assets/src/ba_data/python/bastd/ui/gather/publictab.py @@ -12,7 +12,6 @@ from enum import Enum from dataclasses import dataclass from typing import TYPE_CHECKING, cast -import _ba import ba import ba.internal from bastd.ui.gather import GatherTab @@ -583,7 +582,7 @@ class PublicGatherTab(GatherTab): c_height = region_height - 20 v = c_height - 35 v -= 25 - is_public_enabled = _ba.get_public_party_enabled() + is_public_enabled = ba.internal.get_public_party_enabled() v -= 30 ba.textwidget( @@ -644,7 +643,7 @@ class PublicGatherTab(GatherTab): scale=1.2, color=(1, 1, 1), position=(240, v - 9), - text=str(_ba.get_public_party_max_size())) + text=str(ba.internal.get_public_party_max_size())) btn1 = self._host_max_party_size_minus_button = (ba.buttonwidget( parent=self._container, size=(40, 40), @@ -712,7 +711,7 @@ class PublicGatherTab(GatherTab): # If public sharing is already on, # launch a status-check immediately. - if _ba.get_public_party_enabled(): + if ba.internal.get_public_party_enabled(): self._do_status_check() def _on_public_party_query_result(self, @@ -807,7 +806,7 @@ class PublicGatherTab(GatherTab): text = self._host_name_text if text: name = cast(str, ba.textwidget(query=self._host_name_text)) - _ba.set_public_party_name(name) + ba.internal.set_public_party_name(name) # Update status text. status_text = self._join_status_text @@ -1130,15 +1129,18 @@ class PublicGatherTab(GatherTab): edit=text, text=ba.Lstr( value='${A}\n${B}${C}', - subs=[('${A}', - ba.Lstr(resource='gatherWindow.' - 'partyStatusNotJoinableText')), - ('${B}', - ba.Lstr(resource='gatherWindow.' - 'manualRouterForwardingText', - subs=[('${PORT}', - str(_ba.get_game_port()))])), - ('${C}', ex_line)]), + subs=[ + ('${A}', + ba.Lstr(resource='gatherWindow.' + 'partyStatusNotJoinableText')), + ('${B}', + ba.Lstr(resource='gatherWindow.' + 'manualRouterForwardingText', + subs=[ + ('${PORT}', + str(ba.internal.get_game_port())) + ])), ('${C}', ex_line) + ]), color=(1, 0, 0)) else: ba.textwidget(edit=text, @@ -1168,16 +1170,16 @@ class PublicGatherTab(GatherTab): color=(1, 0, 0)) ba.playsound(ba.getsound('error')) return - _ba.set_public_party_name(name) + ba.internal.set_public_party_name(name) cfg = ba.app.config cfg['Public Party Name'] = name cfg.commit() ba.playsound(ba.getsound('shieldUp')) - _ba.set_public_party_enabled(True) + ba.internal.set_public_party_enabled(True) # In GUI builds we want to authenticate clients only when hosting # public parties. - _ba.set_authenticate_clients(True) + ba.internal.set_authenticate_clients(True) self._do_status_check() ba.buttonwidget( @@ -1188,11 +1190,11 @@ class PublicGatherTab(GatherTab): on_activate_call=self._on_stop_advertising_press) def _on_stop_advertising_press(self) -> None: - _ba.set_public_party_enabled(False) + ba.internal.set_public_party_enabled(False) # In GUI builds we want to authenticate clients only when hosting # public parties. - _ba.set_authenticate_clients(False) + ba.internal.set_authenticate_clients(False) ba.playsound(ba.getsound('shieldDown')) text = self._host_status_text if text: @@ -1224,7 +1226,7 @@ class PublicGatherTab(GatherTab): now = time.time() last_connect_time = self._last_connect_attempt_time if last_connect_time is None or now - last_connect_time > 2.0: - _ba.connect_to_party(address, port=port) + ba.internal.connect_to_party(address, port=port) self._last_connect_attempt_time = now def set_public_party_selection(self, sel: Selection) -> None: @@ -1235,12 +1237,12 @@ class PublicGatherTab(GatherTab): self._have_user_selected_row = True def _on_max_public_party_size_minus_press(self) -> None: - val = max(1, _ba.get_public_party_max_size() - 1) - _ba.set_public_party_max_size(val) + val = max(1, ba.internal.get_public_party_max_size() - 1) + ba.internal.set_public_party_max_size(val) ba.textwidget(edit=self._host_max_party_size_value, text=str(val)) def _on_max_public_party_size_plus_press(self) -> None: - val = _ba.get_public_party_max_size() + val = ba.internal.get_public_party_max_size() val += 1 - _ba.set_public_party_max_size(val) + ba.internal.set_public_party_max_size(val) ba.textwidget(edit=self._host_max_party_size_value, text=str(val)) diff --git a/assets/src/ba_data/python/bastd/ui/getcurrency.py b/assets/src/ba_data/python/bastd/ui/getcurrency.py index 0b3b2f4d..549fec42 100644 --- a/assets/src/ba_data/python/bastd/ui/getcurrency.py +++ b/assets/src/ba_data/python/bastd/ui/getcurrency.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -249,7 +248,7 @@ class GetCurrencyWindow(ba.Window): tex_name='ticketRolls', tex_scale=1.2) # 19.99-ish - self._enable_ad_button = _ba.has_video_ads() + self._enable_ad_button = ba.internal.has_video_ads() h = self._width * 0.5 + 110.0 v = self._height - b_size[1] - 115.0 @@ -444,7 +443,7 @@ class GetCurrencyWindow(ba.Window): next_reward_ad_time = datetime.datetime.utcfromtimestamp( next_reward_ad_time) now = datetime.datetime.utcnow() - if (_ba.have_incentivized_ad() and + if (ba.internal.have_incentivized_ad() and (next_reward_ad_time is None or next_reward_ad_time <= now)): self._ad_button_greyed = False ba.buttonwidget(edit=self._ad_button, color=(0.65, 0.5, 0.7)) @@ -570,7 +569,7 @@ class GetCurrencyWindow(ba.Window): resource='getTicketsWindow.unavailableTemporarilyText'), color=(1, 0, 0)) elif self._enable_ad_button: - _ba.app.ads.show_ad('tickets') + ba.app.ads.show_ad('tickets') else: ba.internal.purchase(item) diff --git a/assets/src/ba_data/python/bastd/ui/helpui.py b/assets/src/ba_data/python/bastd/ui/helpui.py index 79369a9d..8983640f 100644 --- a/assets/src/ba_data/python/bastd/ui/helpui.py +++ b/assets/src/ba_data/python/bastd/ui/helpui.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -76,8 +76,9 @@ class HelpWindow(ba.Window): capture_arrows=True) if ba.app.ui.use_toolbars: - ba.widget(edit=self._scrollwidget, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=self._scrollwidget, + right_widget=ba.internal.get_special_widget('party_button')) ba.containerwidget(edit=self._root_widget, selected_child=self._scrollwidget) @@ -86,8 +87,9 @@ class HelpWindow(ba.Window): if uiscale is ba.UIScale.SMALL and ba.app.ui.use_toolbars: ba.containerwidget(edit=self._root_widget, on_cancel_call=self._close) - ba.widget(edit=self._scrollwidget, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=self._scrollwidget, + left_widget=ba.internal.get_special_widget('back_button')) else: btn = ba.buttonwidget( parent=self._root_widget, @@ -150,7 +152,8 @@ class HelpWindow(ba.Window): maxwidth=txt_maxwidth) txt_width = min( txt_maxwidth, - _ba.get_string_width(txt, suppress_warning=True) * txt_scale) + ba.internal.get_string_width(txt, suppress_warning=True) * + txt_scale) icon_size = 70 hval2 = h - (txt_width * 0.5 + icon_size * 0.5 * icon_buffer) @@ -350,7 +353,8 @@ class HelpWindow(ba.Window): maxwidth=txt_maxwidth) txt_width = min( txt_maxwidth, - _ba.get_string_width(txt, suppress_warning=True) * txt_scale) + ba.internal.get_string_width(txt, suppress_warning=True) * + txt_scale) icon_size = 70 hval2 = h - (txt_width * 0.5 + icon_size * 0.5 * icon_buffer) @@ -496,7 +500,8 @@ class HelpWindow(ba.Window): maxwidth=txt_maxwidth) txt_width = min( txt_maxwidth, - _ba.get_string_width(txt, suppress_warning=True) * txt_scale) + ba.internal.get_string_width(txt, suppress_warning=True) * + txt_scale) icon_size = 70 hval2 = h - (txt_width * 0.5 + icon_size * 0.5 * icon_buffer) ba.imagewidget(parent=self._subcontainer, diff --git a/assets/src/ba_data/python/bastd/ui/kiosk.py b/assets/src/ba_data/python/bastd/ui/kiosk.py index b17b85c6..73fadc96 100644 --- a/assets/src/ba_data/python/bastd/ui/kiosk.py +++ b/assets/src/ba_data/python/bastd/ui/kiosk.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -38,7 +37,7 @@ class KioskWindow(ba.Window): self._show_multiplayer = False # Let's reset all random player names every time we hit the main menu. - _ba.reset_random_player_names() + ba.internal.reset_random_player_names() # Reset achievements too (at least locally). ba.app.config['Achievements'] = {} @@ -391,11 +390,12 @@ class KioskWindow(ba.Window): 'type': 'bs_elimination.EliminationGame' }] appconfig['Free-for-All Playlist Selection'] = 'Just Epic Elim' - _ba.fade_screen(False, - endcall=ba.Call( - ba.pushcall, - ba.Call(_ba.new_host_session, - ba.FreeForAllSession))) + ba.internal.fade_screen(False, + endcall=ba.Call( + ba.pushcall, + ba.Call( + ba.internal.new_host_session, + ba.FreeForAllSession))) else: if mode == 'ctf': appconfig['Team Tournament Playlists']['Just CTF'] = [{ @@ -424,11 +424,12 @@ class KioskWindow(ba.Window): }] appconfig['Team Tournament Playlist Selection'] = ( 'Just Hockey') - _ba.fade_screen(False, - endcall=ba.Call( - ba.pushcall, - ba.Call(_ba.new_host_session, - ba.DualTeamSession))) + ba.internal.fade_screen(False, + endcall=ba.Call( + ba.pushcall, + ba.Call( + ba.internal.new_host_session, + ba.DualTeamSession))) ba.containerwidget(edit=self._root_widget, transition='out_left') return diff --git a/assets/src/ba_data/python/bastd/ui/league/rankbutton.py b/assets/src/ba_data/python/bastd/ui/league/rankbutton.py index 99ab7994..a679b8af 100644 --- a/assets/src/ba_data/python/bastd/ui/league/rankbutton.py +++ b/assets/src/ba_data/python/bastd/ui/league/rankbutton.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -112,7 +111,7 @@ class LeagueRankButton: self._update_for_league_rank_data(data) def _on_activate(self) -> None: - _ba.increment_analytics_count('League rank button press') + ba.internal.increment_analytics_count('League rank button press') self._on_activate_call() def __del__(self) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/league/rankwindow.py b/assets/src/ba_data/python/bastd/ui/league/rankwindow.py index ff8e8bd3..6c6dab43 100644 --- a/assets/src/ba_data/python/bastd/ui/league/rankwindow.py +++ b/assets/src/ba_data/python/bastd/ui/league/rankwindow.py @@ -7,7 +7,6 @@ from __future__ import annotations import copy from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui import popup as popup_ui @@ -748,7 +747,7 @@ class LeagueRankWindow(ba.Window): ba.textwidget(edit=self._league_text, text=lname, color=lcolor) l_text_width = min( self._league_text_maxwidth, - _ba.get_string_width(lname, suppress_warning=True) * + ba.internal.get_string_width(lname, suppress_warning=True) * self._league_text_scale) ba.textwidget( edit=self._league_number_text, diff --git a/assets/src/ba_data/python/bastd/ui/mainmenu.py b/assets/src/ba_data/python/bastd/ui/mainmenu.py index 1f729bb7..6e8ad23e 100644 --- a/assets/src/ba_data/python/bastd/ui/mainmenu.py +++ b/assets/src/ba_data/python/bastd/ui/mainmenu.py @@ -9,7 +9,6 @@ from typing import TYPE_CHECKING import ba import ba.internal -import _ba if TYPE_CHECKING: from typing import Any, Callable @@ -22,8 +21,8 @@ class MainMenuWindow(ba.Window): # pylint: disable=cyclic-import import threading from bastd.mainmenu import MainMenuSession - self._in_game = not isinstance(_ba.get_foreground_host_session(), - MainMenuSession) + self._in_game = not isinstance( + ba.internal.get_foreground_host_session(), MainMenuSession) # Preload some modules we use in a background thread so we won't # have a visual hitch when the user taps them. @@ -102,7 +101,7 @@ class MainMenuWindow(ba.Window): try: app = ba.app force_test = False - _ba.get_local_active_input_devices_count() + ba.internal.get_local_active_input_devices_count() if (((app.on_tv or app.platform == 'mac') and ba.app.config.get('launchCount', 0) <= 1) or force_test): @@ -188,7 +187,7 @@ class MainMenuWindow(ba.Window): (not self._in_game or not app.toolbar_test) and not (self._is_demo or self._is_arcade or self._is_iircade)) - self._input_device = input_device = _ba.get_ui_input_device() + self._input_device = input_device = ba.internal.get_ui_input_device() self._input_player = input_device.player if input_device else None self._connected_to_remote_player = ( input_device.is_connected_to_remote_player() @@ -235,7 +234,7 @@ class MainMenuWindow(ba.Window): self._p_index += 1 # If we're in a replay, we have a 'Leave Replay' button. - if _ba.is_in_replay(): + if ba.internal.is_in_replay(): ba.buttonwidget(parent=self._root_widget, position=(h - self._button_width * 0.5 * scale, v), @@ -244,7 +243,7 @@ class MainMenuWindow(ba.Window): autoselect=self._use_autoselect, label=ba.Lstr(resource='replayEndText'), on_activate_call=self._confirm_end_replay) - elif _ba.get_foreground_host_session() is not None: + elif ba.internal.get_foreground_host_session() is not None: ba.buttonwidget( parent=self._root_widget, position=(h - self._button_width * 0.5 * scale, v), @@ -344,7 +343,7 @@ class MainMenuWindow(ba.Window): # Add speed-up/slow-down buttons for replays. # (ideally this should be part of a fading-out playback bar like most # media players but this works for now). - if _ba.is_in_replay(): + if ba.internal.is_in_replay(): b_size = 50.0 b_buffer = 10.0 t_scale = 0.75 @@ -685,7 +684,7 @@ class MainMenuWindow(ba.Window): # pylint: disable=too-many-locals # pylint: disable=too-many-statements custom_menu_entries: list[dict[str, Any]] = [] - session = _ba.get_foreground_host_session() + session = ba.internal.get_foreground_host_session() if session is not None: try: custom_menu_entries = session.get_custom_menu_entries() @@ -822,8 +821,9 @@ class MainMenuWindow(ba.Window): if ba.do_once(): print('_change_replay_speed called without widget') return - _ba.set_replay_speed_exponent(_ba.get_replay_speed_exponent() + offs) - actual_speed = pow(2.0, _ba.get_replay_speed_exponent()) + ba.internal.set_replay_speed_exponent( + ba.internal.get_replay_speed_exponent() + offs) + actual_speed = pow(2.0, ba.internal.get_replay_speed_exponent()) ba.textwidget(edit=self._replay_speed_text, text=ba.Lstr(resource='watchWindow.playbackSpeedText', subs=[('${SPEED}', str(actual_speed))])) @@ -895,7 +895,7 @@ class MainMenuWindow(ba.Window): cancel_is_selected=True) def _leave_party(self) -> None: - _ba.disconnect_from_host() + ba.internal.disconnect_from_host() def _end_game(self) -> None: if not self._root_widget: @@ -945,7 +945,7 @@ class MainMenuWindow(ba.Window): def _do_game_service_press(self) -> None: self._save_state() - _ba.show_online_score_ui() + ba.internal.show_online_score_ui() def _save_state(self) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/onscreenkeyboard.py b/assets/src/ba_data/python/bastd/ui/onscreenkeyboard.py index 3997cca3..842ecd16 100644 --- a/assets/src/ba_data/python/bastd/ui/onscreenkeyboard.py +++ b/assets/src/ba_data/python/bastd/ui/onscreenkeyboard.py @@ -6,10 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING, cast -import _ba import ba -from ba import charstr -from ba import SpecialChar as SpCh +import ba.internal if TYPE_CHECKING: pass @@ -25,7 +23,7 @@ class OnScreenKeyboardWindow(ba.Window): uiscale = ba.app.ui.uiscale top_extra = 20 if uiscale is ba.UIScale.SMALL else 0 super().__init__(root_widget=ba.containerwidget( - parent=_ba.get_special_widget('overlay_stack'), + parent=ba.internal.get_special_widget('overlay_stack'), size=(self._width, self._height + top_extra), transition='in_scale', scale_origin_stack_offset=self._target_text. @@ -129,7 +127,7 @@ class OnScreenKeyboardWindow(ba.Window): autoselect=True, textcolor=key_textcolor, color=key_color_dark, - label=charstr(SpCh.SHIFT), + label=ba.charstr(ba.SpecialChar.SHIFT), enable_sound=False, extra_touch_border_scale=0.3, button_type='square', @@ -165,7 +163,7 @@ class OnScreenKeyboardWindow(ba.Window): repeat=True, textcolor=key_textcolor, color=key_color_dark, - label=charstr(SpCh.DELETE), + label=ba.charstr(ba.SpecialChar.DELETE), button_type='square', on_activate_call=self._del) v -= (key_height + 9) @@ -193,7 +191,7 @@ class OnScreenKeyboardWindow(ba.Window): enable_sound=False, textcolor=key_textcolor, color=key_color_dark, - label=charstr(SpCh.LOGO_FLAT), + label=ba.charstr(ba.SpecialChar.LOGO_FLAT), extra_touch_border_scale=0.3, button_type='square', ) @@ -255,14 +253,14 @@ class OnScreenKeyboardWindow(ba.Window): ba.buttonwidget(edit=self._shift_button, color=self._key_color_lit if self._mode == 'caps' else self._key_color_dark, - label=charstr(SpCh.SHIFT), + label=ba.charstr(ba.SpecialChar.SHIFT), on_activate_call=self._shift) ba.buttonwidget(edit=self._num_mode_button, label='123#&*', on_activate_call=self._num_mode) ba.buttonwidget(edit=self._emoji_button, color=self._key_color_dark, - label=charstr(SpCh.LOGO_FLAT), + label=ba.charstr(ba.SpecialChar.LOGO_FLAT), on_activate_call=self._next_mode) else: if self._mode == 'num': @@ -278,7 +276,7 @@ class OnScreenKeyboardWindow(ba.Window): on_activate_call=self._abc_mode) ba.buttonwidget(edit=self._emoji_button, color=self._key_color_dark, - label=charstr(SpCh.LOGO_FLAT), + label=ba.charstr(ba.SpecialChar.LOGO_FLAT), on_activate_call=self._next_mode) for i, btn in enumerate(self._char_keys): diff --git a/assets/src/ba_data/python/bastd/ui/party.py b/assets/src/ba_data/python/bastd/ui/party.py index 283b7a02..7de7b62d 100644 --- a/assets/src/ba_data/python/bastd/ui/party.py +++ b/assets/src/ba_data/python/bastd/ui/party.py @@ -7,8 +7,8 @@ from __future__ import annotations import math from typing import TYPE_CHECKING, cast -import _ba import ba +import ba.internal from bastd.ui import popup if TYPE_CHECKING: @@ -19,10 +19,10 @@ class PartyWindow(ba.Window): """Party list/chat window.""" def __del__(self) -> None: - _ba.set_party_window_open(False) + ba.internal.set_party_window_open(False) def __init__(self, origin: Sequence[float] = (0, 0)): - _ba.set_party_window_open(True) + ba.internal.set_party_window_open(True) self._r = 'partyWindow' self._popup_type: str | None = None self._popup_party_member_client_id: int | None = None @@ -35,7 +35,7 @@ class PartyWindow(ba.Window): size=(self._width, self._height), transition='in_scale', color=(0.40, 0.55, 0.20), - parent=_ba.get_special_widget('overlay_stack'), + parent=ba.internal.get_special_widget('overlay_stack'), on_outside_click_call=self.close_with_sound, scale_origin_stack_offset=origin, scale=(2.0 if uiscale is ba.UIScale.SMALL else @@ -68,7 +68,7 @@ class PartyWindow(ba.Window): color=(0.55, 0.73, 0.25), iconscale=1.2) - info = _ba.get_connection_to_host_info() + info = ba.internal.get_connection_to_host_info() if info.get('name', '') != '': title = ba.Lstr(value=info['name']) else: @@ -116,7 +116,7 @@ class PartyWindow(ba.Window): # add all existing messages if chat is not muted if not ba.app.config.resolve('Chat Muted'): - msgs = _ba.get_chat_messages() + msgs = ba.internal.get_chat_messages() for msg in msgs: self._add_msg(msg) @@ -215,7 +215,7 @@ class PartyWindow(ba.Window): ba.textwidget(edit=self._muted_text, color=(1, 1, 1, 0.0)) # update roster section - roster = _ba.get_game_roster() + roster = ba.internal.get_game_roster() if roster != self._roster: self._roster = roster @@ -318,7 +318,7 @@ class PartyWindow(ba.Window): if is_host: twd = min( c_width * 0.85, - _ba.get_string_width( + ba.internal.get_string_width( p_str, suppress_warning=True) * t_scale) self._name_widgets.append( @@ -357,7 +357,7 @@ class PartyWindow(ba.Window): assert self._popup_party_member_client_id is not None # Ban for 5 minutes. - result = _ba.disconnect_client( + result = ba.internal.disconnect_client( self._popup_party_member_client_id, ban_time=5 * 60) if not result: ba.playsound(ba.getsound('error')) @@ -379,12 +379,12 @@ class PartyWindow(ba.Window): def _on_party_member_press(self, client_id: int, is_host: bool, widget: ba.Widget) -> None: # if we're the host, pop up 'kick' options for all non-host members - if _ba.get_foreground_host_session() is not None: + if ba.internal.get_foreground_host_session() is not None: kick_str = ba.Lstr(resource='kickText') else: # kick-votes appeared in build 14248 - if (_ba.get_connection_to_host_info().get('build_number', 0) < - 14248): + if (ba.internal.get_connection_to_host_info().get( + 'build_number', 0) < 14248): return kick_str = ba.Lstr(resource='kickVoteText') uiscale = ba.app.ui.uiscale @@ -401,7 +401,8 @@ class PartyWindow(ba.Window): self._popup_party_member_is_host = is_host def _send_chat_message(self) -> None: - _ba.chatmessage(cast(str, ba.textwidget(query=self._text_field))) + ba.internal.chatmessage( + cast(str, ba.textwidget(query=self._text_field))) ba.textwidget(edit=self._text_field, text='') def close(self) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/partyqueue.py b/assets/src/ba_data/python/bastd/ui/partyqueue.py index ae8aa3f0..78673223 100644 --- a/assets/src/ba_data/python/bastd/ui/partyqueue.py +++ b/assets/src/ba_data/python/bastd/ui/partyqueue.py @@ -8,7 +8,6 @@ import random import time from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -450,9 +449,9 @@ class PartyQueueWindow(ba.Window): now = time.time() if (self._last_connect_attempt_time is None or now - self._last_connect_attempt_time > 10.0): - _ba.connect_to_party(address=self._address, - port=self._port, - print_progress=False) + ba.internal.connect_to_party(address=self._address, + port=self._port, + print_progress=False) self._last_connect_attempt_time = now def on_boost_press(self) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/play.py b/assets/src/ba_data/python/bastd/ui/play.py index d288552e..498c0cc7 100644 --- a/assets/src/ba_data/python/bastd/ui/play.py +++ b/assets/src/ba_data/python/bastd/ui/play.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -130,13 +129,15 @@ class PlayWindow(ba.Window): on_activate_call=self._coop) if ba.app.ui.use_toolbars and uiscale is ba.UIScale.SMALL: - ba.widget(edit=btn, - left_widget=_ba.get_special_widget('back_button')) - ba.widget(edit=btn, - up_widget=_ba.get_special_widget('account_button')) ba.widget( edit=btn, - down_widget=_ba.get_special_widget('settings_button')) + left_widget=ba.internal.get_special_widget('back_button')) + ba.widget( + edit=btn, + up_widget=ba.internal.get_special_widget('account_button')) + ba.widget(edit=btn, + down_widget=ba.internal.get_special_widget( + 'settings_button')) self._draw_dude(0, btn, @@ -217,9 +218,11 @@ class PlayWindow(ba.Window): on_activate_call=self._team_tourney) if ba.app.ui.use_toolbars: - ba.widget(edit=btn, - up_widget=_ba.get_special_widget('tickets_plus_button'), - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=btn, + up_widget=ba.internal.get_special_widget( + 'tickets_plus_button'), + right_widget=ba.internal.get_special_widget('party_button')) xxx = -14 self._draw_dude(2, diff --git a/assets/src/ba_data/python/bastd/ui/playlist/addgame.py b/assets/src/ba_data/python/bastd/ui/playlist/addgame.py index 7ff68bc1..17af366d 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/addgame.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/addgame.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -58,8 +57,9 @@ class PlaylistAddGameWindow(ba.Window): on_activate_call=self._add) if ba.app.ui.use_toolbars: - ba.widget(edit=select_button, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=select_button, + right_widget=ba.internal.get_special_widget('party_button')) ba.textwidget(parent=self._root_widget, position=(self._width * 0.5, self._height - 28), @@ -134,7 +134,7 @@ class PlaylistAddGameWindow(ba.Window): # We asked for a bg thread completion cb so we can do some # filtering here in the bg thread where its not gonna cause hitches. - assert not _ba.in_logic_thread() + assert not ba.in_logic_thread() sessiontype = self._editcontroller.get_session_type() unowned = get_unowned_game_types() self._game_types = [ @@ -210,8 +210,8 @@ class PlaylistAddGameWindow(ba.Window): self._refresh(select_get_more_games_button=True) def _add(self) -> None: - _ba.lock_all_input() # Make sure no more commands happen. - ba.timer(0.1, _ba.unlock_all_input, timetype=ba.TimeType.REAL) + ba.internal.lock_all_input() # Make sure no more commands happen. + ba.timer(0.1, ba.internal.unlock_all_input, timetype=ba.TimeType.REAL) assert self._selected_game_type is not None self._editcontroller.add_game_type_selected(self._selected_game_type) diff --git a/assets/src/ba_data/python/bastd/ui/playlist/browser.py b/assets/src/ba_data/python/bastd/ui/playlist/browser.py index 450b770a..8a621261 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/browser.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/browser.py @@ -8,7 +8,6 @@ import copy import math from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -369,14 +368,14 @@ class PlaylistBrowserWindow(ba.Window): if (x == 0 and ba.app.ui.use_toolbars and uiscale is ba.UIScale.SMALL): - ba.widget( - edit=btn, - left_widget=_ba.get_special_widget('back_button')) + ba.widget(edit=btn, + left_widget=ba.internal.get_special_widget( + 'back_button')) if (x == columns - 1 and ba.app.ui.use_toolbars and uiscale is ba.UIScale.SMALL): - ba.widget( - edit=btn, - right_widget=_ba.get_special_widget('party_button')) + ba.widget(edit=btn, + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.buttonwidget( edit=btn, on_activate_call=ba.Call(self._on_playlist_press, btn, diff --git a/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py b/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py index 5a0fd8ac..2f99ad04 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/customizebrowser.py @@ -8,7 +8,6 @@ import copy import time from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -226,7 +225,7 @@ class PlaylistCustomizeBrowserWindow(ba.Window): ba.widget(edit=btn, right_widget=scrollwidget) ba.widget(edit=scrollwidget, left_widget=new_button, - right_widget=_ba.get_special_widget('party_button') + right_widget=ba.internal.get_special_widget('party_button') if ba.app.ui.use_toolbars else None) # make sure config exists @@ -280,23 +279,23 @@ class PlaylistCustomizeBrowserWindow(ba.Window): def _run_selected_playlist(self) -> None: # pylint: disable=cyclic-import - _ba.unlock_all_input() + ba.internal.unlock_all_input() try: - _ba.new_host_session(self._sessiontype) + ba.internal.new_host_session(self._sessiontype) except Exception: from bastd import mainmenu ba.print_exception(f'Error running session {self._sessiontype}.') # Drop back into a main menu session. - _ba.new_host_session(mainmenu.MainMenuSession) + ba.internal.new_host_session(mainmenu.MainMenuSession) def _choose_playlist(self) -> None: if self._selected_playlist_name is None: return self._save_playlist_selection() ba.containerwidget(edit=self._root_widget, transition='out_left') - _ba.fade_screen(False, endcall=self._run_selected_playlist) - _ba.lock_all_input() + ba.internal.fade_screen(False, endcall=self._run_selected_playlist) + ba.internal.lock_all_input() def _refresh(self, select_playlist: str | None = None) -> None: from efro.util import asserttype diff --git a/assets/src/ba_data/python/bastd/ui/playlist/edit.py b/assets/src/ba_data/python/bastd/ui/playlist/edit.py index a7ac1358..7e2040b5 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/edit.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/edit.py @@ -8,7 +8,6 @@ from typing import TYPE_CHECKING, cast import ba import ba.internal -import _ba if TYPE_CHECKING: from bastd.ui.playlist.editcontroller import PlaylistEditController @@ -59,8 +58,9 @@ class PlaylistEditWindow(ba.Window): text_scale=1.2) if ba.app.ui.use_toolbars: - ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=btn, + right_widget=ba.internal.get_special_widget('party_button')) ba.widget(edit=cancel_button, left_widget=cancel_button, diff --git a/assets/src/ba_data/python/bastd/ui/playlist/editgame.py b/assets/src/ba_data/python/bastd/ui/playlist/editgame.py index 9674357e..ece7304b 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/editgame.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/editgame.py @@ -8,8 +8,8 @@ import copy import random from typing import TYPE_CHECKING, cast -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -134,7 +134,7 @@ class PlaylistEditGameWindow(ba.Window): resource='doneText')) if ba.app.ui.use_toolbars: - pbtn = _ba.get_special_widget('party_button') + pbtn = ba.internal.get_special_widget('party_button') ba.widget(edit=add_button, right_widget=pbtn, up_widget=pbtn) ba.textwidget(parent=self._root_widget, diff --git a/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py b/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py index d1d1f480..7e23d6a6 100644 --- a/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py +++ b/assets/src/ba_data/python/bastd/ui/playlist/mapselect.py @@ -7,7 +7,6 @@ from __future__ import annotations import math from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -166,9 +165,9 @@ class PlaylistMapSelectWindow(ba.Window): if y == 0: ba.widget(edit=btn, up_widget=self._cancel_button) if x == columns - 1 and ba.app.ui.use_toolbars: - ba.widget( - edit=btn, - right_widget=_ba.get_special_widget('party_button')) + ba.widget(edit=btn, + right_widget=ba.internal.get_special_widget( + 'party_button')) ba.widget(edit=btn, show_buffer_top=60, show_buffer_bottom=60) if self._maps[index][0] == self._previous_map: @@ -237,8 +236,8 @@ class PlaylistMapSelectWindow(ba.Window): edit_info=self._edit_info).get_root_widget()) def _select_with_delay(self, map_name: str) -> None: - _ba.lock_all_input() - ba.timer(0.1, _ba.unlock_all_input, timetype=ba.TimeType.REAL) + ba.internal.lock_all_input() + ba.timer(0.1, ba.internal.unlock_all_input, timetype=ba.TimeType.REAL) ba.timer(0.1, ba.WeakCall(self._select, map_name), timetype=ba.TimeType.REAL) diff --git a/assets/src/ba_data/python/bastd/ui/playoptions.py b/assets/src/ba_data/python/bastd/ui/playoptions.py index d313cbae..8dfb4aaf 100644 --- a/assets/src/ba_data/python/bastd/ui/playoptions.py +++ b/assets/src/ba_data/python/bastd/ui/playoptions.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui import popup @@ -419,8 +418,8 @@ class PlayOptionsWindow(popup.PopupWindow): if self._delegate is not None: self._delegate.on_play_options_window_run_game() else: - _ba.fade_screen(False, endcall=self._run_selected_playlist) - _ba.lock_all_input() + ba.internal.fade_screen(False, endcall=self._run_selected_playlist) + ba.internal.lock_all_input() self._transition_out(transition='out_left') if self._delegate is not None: self._delegate.on_play_options_window_run_game() @@ -428,12 +427,12 @@ class PlayOptionsWindow(popup.PopupWindow): cfg.commit() def _run_selected_playlist(self) -> None: - _ba.unlock_all_input() + ba.internal.unlock_all_input() try: - _ba.new_host_session(self._sessiontype) + ba.internal.new_host_session(self._sessiontype) except Exception: from bastd import mainmenu ba.print_exception('exception running session', self._sessiontype) # Drop back into a main menu session. - _ba.new_host_session(mainmenu.MainMenuSession) + ba.internal.new_host_session(mainmenu.MainMenuSession) diff --git a/assets/src/ba_data/python/bastd/ui/popup.py b/assets/src/ba_data/python/bastd/ui/popup.py index 0315b94f..8f918fe8 100644 --- a/assets/src/ba_data/python/bastd/ui/popup.py +++ b/assets/src/ba_data/python/bastd/ui/popup.py @@ -7,8 +7,8 @@ from __future__ import annotations import weakref from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Sequence, Callable @@ -81,7 +81,7 @@ class PopupWindow: scale=scale, toolbar_visibility=toolbar_visibility, size=size, - parent=_ba.get_special_widget('overlay_stack'), + parent=ba.internal.get_special_widget('overlay_stack'), stack_offset=(x_fin - x_offs, y_fin - y_offs), scale_origin_stack_offset=(position[0], position[1]), on_outside_click_call=self.on_popup_cancel, @@ -159,15 +159,15 @@ class PopupMenuWindow(PopupWindow): self._width, min( maxwidth, - _ba.get_string_width(choice_display_name, - suppress_warning=True)) + 75) + ba.internal.get_string_width( + choice_display_name, suppress_warning=True)) + 75) else: self._width = max( self._width, min( maxwidth, - _ba.get_string_width(choice_display_name, - suppress_warning=True)) + 60) + ba.internal.get_string_width( + choice_display_name, suppress_warning=True)) + 60) # init parent class - this will rescale and reposition things as # needed and create our root widget diff --git a/assets/src/ba_data/python/bastd/ui/profile/browser.py b/assets/src/ba_data/python/bastd/ui/profile/browser.py index ff2c0574..ff8c6111 100644 --- a/assets/src/ba_data/python/bastd/ui/profile/browser.py +++ b/assets/src/ba_data/python/bastd/ui/profile/browser.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -332,7 +331,7 @@ class ProfileBrowserWindow(ba.Window): # If there's a team-chooser in existence, tell it the profile-list # has probably changed. - session = _ba.get_foreground_host_session() + session = ba.internal.get_foreground_host_session() if session is not None: session.handlemessage(PlayerProfilesChangedMessage()) diff --git a/assets/src/ba_data/python/bastd/ui/profile/edit.py b/assets/src/ba_data/python/bastd/ui/profile/edit.py index 7b4a13a6..3304d1cd 100644 --- a/assets/src/ba_data/python/bastd/ui/profile/edit.py +++ b/assets/src/ba_data/python/bastd/ui/profile/edit.py @@ -7,7 +7,6 @@ from __future__ import annotations import random from typing import TYPE_CHECKING, cast -import _ba import ba import ba.internal @@ -145,7 +144,7 @@ class EditProfileWindow(ba.Window): # Assign a random name if they had none. if self._name == '': - names = _ba.get_random_names() + names = ba.internal.get_random_names() self._name = names[random.randrange(len(names))] self._clipped_name_text = ba.textwidget(parent=self._root_widget, @@ -189,7 +188,8 @@ class EditProfileWindow(ba.Window): resource='editProfileWindow.accountProfileText').evaluate() b_width = min( 270.0, - _ba.get_string_width(txtl, suppress_warning=True) * 0.6) + ba.internal.get_string_width(txtl, suppress_warning=True) * + 0.6) ba.textwidget(parent=self._root_widget, position=(self._width * 0.5, v - 39), size=(0, 0), @@ -259,7 +259,8 @@ class EditProfileWindow(ba.Window): resource='editProfileWindow.globalProfileText').evaluate() b_width = min( 240.0, - _ba.get_string_width(txtl, suppress_warning=True) * 0.6) + ba.internal.get_string_width(txtl, suppress_warning=True) * + 0.6) ba.textwidget(parent=self._root_widget, position=(self._width * 0.5, v - 39), size=(0, 0), @@ -300,7 +301,8 @@ class EditProfileWindow(ba.Window): resource='editProfileWindow.localProfileText').evaluate() b_width = min( 270.0, - _ba.get_string_width(txtl, suppress_warning=True) * 0.6) + ba.internal.get_string_width(txtl, suppress_warning=True) * + 0.6) ba.textwidget(parent=self._root_widget, position=(self._width * 0.5, v - 43), size=(0, 0), diff --git a/assets/src/ba_data/python/bastd/ui/report.py b/assets/src/ba_data/python/bastd/ui/report.py index 5dd3aee8..1f322ca4 100644 --- a/assets/src/ba_data/python/bastd/ui/report.py +++ b/assets/src/ba_data/python/bastd/ui/report.py @@ -4,7 +4,6 @@ from __future__ import annotations -import _ba import ba import ba.internal @@ -19,7 +18,7 @@ class ReportPlayerWindow(ba.Window): self._transition_out = 'out_scale' scale_origin = origin_widget.get_screen_space_center() - overlay_stack = _ba.get_special_widget('overlay_stack') + overlay_stack = ba.internal.get_special_widget('overlay_stack') uiscale = ba.app.ui.uiscale super().__init__(root_widget=ba.containerwidget( size=(self._width, self._height), @@ -71,7 +70,7 @@ class ReportPlayerWindow(ba.Window): }) body = ba.Lstr(resource='reportPlayerExplanationText').evaluate() ba.open_url('mailto:support@froemling.net' - f'?subject={_ba.appnameupper()} Player Report: ' + + f'?subject={ba.internal.appnameupper()} Player Report: ' + self._account_id + '&body=' + parse.quote(body)) self.close() @@ -84,7 +83,7 @@ class ReportPlayerWindow(ba.Window): }) body = ba.Lstr(resource='reportPlayerExplanationText').evaluate() ba.open_url('mailto:support@froemling.net' - f'?subject={_ba.appnameupper()} Player Report: ' + + f'?subject={ba.internal.appnameupper()} Player Report: ' + self._account_id + '&body=' + parse.quote(body)) self.close() diff --git a/assets/src/ba_data/python/bastd/ui/serverdialog.py b/assets/src/ba_data/python/bastd/ui/serverdialog.py index 99d19d95..ba226c78 100644 --- a/assets/src/ba_data/python/bastd/ui/serverdialog.py +++ b/assets/src/ba_data/python/bastd/ui/serverdialog.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -23,8 +22,9 @@ class ServerDialogWindow(ba.Window): subs=data.get('subs', [])).evaluate() txt = txt.strip() txt_scale = 1.5 - txt_height = (_ba.get_string_height(txt, suppress_warning=True) * - txt_scale) + txt_height = ( + ba.internal.get_string_height(txt, suppress_warning=True) * + txt_scale) self._width = 500 self._height = 160 + min(200, txt_height) uiscale = ba.app.ui.uiscale diff --git a/assets/src/ba_data/python/bastd/ui/settings/advanced.py b/assets/src/ba_data/python/bastd/ui/settings/advanced.py index b76d3194..8a85f12a 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/advanced.py +++ b/assets/src/ba_data/python/bastd/ui/settings/advanced.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui import popup as popup_ui @@ -201,10 +200,10 @@ class AdvancedSettingsWindow(ba.Window): # menu based on the language so still need this. ...however we could # make this more limited to it only rebuilds that one menu instead # of everything. - if self._menu_open or (self._prev_lang == _ba.app.config.get( + if self._menu_open or (self._prev_lang == ba.app.config.get( 'Lang', None) and self._prev_lang_list == available_languages): return - self._prev_lang = _ba.app.config.get('Lang', None) + self._prev_lang = ba.app.config.get('Lang', None) self._prev_lang_list = available_languages # Clear out our sub-container. @@ -252,8 +251,8 @@ class AdvancedSettingsWindow(ba.Window): h_align='right', v_align='center') - languages = _ba.app.lang.available_languages - cur_lang = _ba.app.config.get('Lang', None) + languages = ba.app.lang.available_languages + cur_lang = ba.app.config.get('Lang', None) if cur_lang is None: cur_lang = 'Auto' @@ -513,11 +512,12 @@ class AdvancedSettingsWindow(ba.Window): ba.widget(edit=child, show_buffer_bottom=30, show_buffer_top=20) if ba.app.ui.use_toolbars: - pbtn = _ba.get_special_widget('party_button') + pbtn = ba.internal.get_special_widget('party_button') ba.widget(edit=self._scrollwidget, right_widget=pbtn) if self._back_button is None: - ba.widget(edit=self._scrollwidget, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=self._scrollwidget, + left_widget=ba.internal.get_special_widget('back_button')) self._restore_state() diff --git a/assets/src/ba_data/python/bastd/ui/settings/allsettings.py b/assets/src/ba_data/python/bastd/ui/settings/allsettings.py index bec6f050..b1f08f0e 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/allsettings.py +++ b/assets/src/ba_data/python/bastd/ui/settings/allsettings.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -118,7 +118,7 @@ class AllSettingsWindow(ba.Window): label='', on_activate_call=self._do_controllers) if ba.app.ui.use_toolbars and self._back_button is None: - bbtn = _ba.get_special_widget('back_button') + bbtn = ba.internal.get_special_widget('back_button') ba.widget(edit=ctb, left_widget=bbtn) _b_title(x_offs2, v, ctb, ba.Lstr(resource=self._r + '.controllersText')) @@ -138,7 +138,7 @@ class AllSettingsWindow(ba.Window): label='', on_activate_call=self._do_graphics) if ba.app.ui.use_toolbars: - pbtn = _ba.get_special_widget('party_button') + pbtn = ba.internal.get_special_widget('party_button') ba.widget(edit=gfxb, up_widget=pbtn, right_widget=pbtn) _b_title(x_offs3, v, gfxb, ba.Lstr(resource=self._r + '.graphicsText')) imgw = imgh = 110 diff --git a/assets/src/ba_data/python/bastd/ui/settings/audio.py b/assets/src/ba_data/python/bastd/ui/settings/audio.py index bf93f6ba..ad464c39 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/audio.py +++ b/assets/src/ba_data/python/bastd/ui/settings/audio.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -105,8 +105,9 @@ class AudioSettingsWindow(ba.Window): maxval=1.0, increment=0.1) if ba.app.ui.use_toolbars: - ba.widget(edit=svne.plusbutton, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=svne.plusbutton, + right_widget=ba.internal.get_special_widget('party_button')) v -= spacing self._music_volume_numedit = ConfigNumberEdit( parent=self._root_widget, @@ -208,12 +209,13 @@ class AudioSettingsWindow(ba.Window): # We require disk access for soundtracks; # if we don't have it, request it. - if not _ba.have_permission(ba.Permission.STORAGE): + if not ba.internal.have_permission(ba.Permission.STORAGE): ba.playsound(ba.getsound('ding')) ba.screenmessage(ba.Lstr(resource='storagePermissionAccessText'), color=(0.5, 1, 0.5)) ba.timer(1.0, - ba.Call(_ba.request_permission, ba.Permission.STORAGE), + ba.Call(ba.internal.request_permission, + ba.Permission.STORAGE), timetype=ba.TimeType.REAL) return diff --git a/assets/src/ba_data/python/bastd/ui/settings/controls.py b/assets/src/ba_data/python/bastd/ui/settings/controls.py index 017568d8..3e9566a1 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/controls.py +++ b/assets/src/ba_data/python/bastd/ui/settings/controls.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -41,7 +41,7 @@ class ControlsSettingsWindow(ba.Window): self._r = 'configControllersWindow' app = ba.app - # is_fire_tv = _ba.is_running_on_fire_tv() + # is_fire_tv = ba.internal.is_running_on_fire_tv() spacing = 50.0 button_width = 350.0 @@ -63,7 +63,7 @@ class ControlsSettingsWindow(ba.Window): height += spacing show_touch = False - if _ba.have_touchscreen_input(): + if ba.internal.have_touchscreen_input(): show_touch = True height += spacing @@ -73,7 +73,8 @@ class ControlsSettingsWindow(ba.Window): height += space_height show_keyboard = False - if _ba.getinputdevice('Keyboard', '#1', doraise=False) is not None: + if ba.internal.getinputdevice('Keyboard', '#1', + doraise=False) is not None: show_keyboard = True height += spacing show_keyboard_p2 = False if app.vr_mode else show_keyboard @@ -101,7 +102,7 @@ class ControlsSettingsWindow(ba.Window): # (we can run into problems where devices register as one of each # type otherwise).. show_mac_controller_subsystem = False - if platform == 'mac' and _ba.is_xcode_build(): + if platform == 'mac' and ba.internal.is_xcode_build(): show_mac_controller_subsystem = True if show_mac_controller_subsystem: @@ -163,7 +164,8 @@ class ControlsSettingsWindow(ba.Window): on_activate_call=self._do_touchscreen) if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) if not self._have_selected_child: ba.containerwidget(edit=self._root_widget, selected_child=self._touch_button) @@ -182,7 +184,8 @@ class ControlsSettingsWindow(ba.Window): on_activate_call=self._do_gamepads) if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) if not self._have_selected_child: ba.containerwidget(edit=self._root_widget, selected_child=self._gamepads_button) @@ -206,7 +209,8 @@ class ControlsSettingsWindow(ba.Window): on_activate_call=self._config_keyboard) if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) if not self._have_selected_child: ba.containerwidget(edit=self._root_widget, selected_child=self._keyboard_button) @@ -235,7 +239,8 @@ class ControlsSettingsWindow(ba.Window): on_activate_call=self._do_mobile_devices) if ba.app.ui.use_toolbars: ba.widget(edit=btn, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) if not self._have_selected_child: ba.containerwidget(edit=self._root_widget, selected_child=self._idevices_button) @@ -251,13 +256,15 @@ class ControlsSettingsWindow(ba.Window): ba.Lstr(resource='settingsWindowAdvanced.mustRestartText'), color=(1, 1, 0)) ba.playsound(ba.getsound('gunCocking')) - _ba.set_low_level_config_value('enablexinput', not value) + ba.internal.set_low_level_config_value('enablexinput', + not value) ba.checkboxwidget( parent=self._root_widget, position=(100, v + 3), size=(120, 30), - value=(not _ba.get_low_level_config_value('enablexinput', 1)), + value=(not ba.internal.get_low_level_config_value( + 'enablexinput', 1)), maxwidth=200, on_value_change_call=do_toggle, text=ba.Lstr(resource='disableXInputText'), @@ -323,8 +330,8 @@ class ControlsSettingsWindow(ba.Window): self._save_state() ba.containerwidget(edit=self._root_widget, transition='out_left') ba.app.ui.set_main_menu_window( - ConfigKeyboardWindow(_ba.getinputdevice('Keyboard', - '#1')).get_root_widget()) + ConfigKeyboardWindow(ba.internal.getinputdevice( + 'Keyboard', '#1')).get_root_widget()) def _config_keyboard2(self) -> None: # pylint: disable=cyclic-import @@ -332,8 +339,8 @@ class ControlsSettingsWindow(ba.Window): self._save_state() ba.containerwidget(edit=self._root_widget, transition='out_left') ba.app.ui.set_main_menu_window( - ConfigKeyboardWindow(_ba.getinputdevice('Keyboard', - '#2')).get_root_widget()) + ConfigKeyboardWindow(ba.internal.getinputdevice( + 'Keyboard', '#2')).get_root_widget()) def _do_mobile_devices(self) -> None: # pylint: disable=cyclic-import diff --git a/assets/src/ba_data/python/bastd/ui/settings/gamepad.py b/assets/src/ba_data/python/bastd/ui/settings/gamepad.py index ea86a950..4d5d9465 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/gamepad.py +++ b/assets/src/ba_data/python/bastd/ui/settings/gamepad.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -801,7 +801,7 @@ class AwaitGamepadInputWindow(ba.Window): ba.Call(self._decrement), repeat=True, timetype=ba.TimeType.REAL) - _ba.capture_gamepad_input(ba.WeakCall(self._event_callback)) + ba.internal.capture_gamepad_input(ba.WeakCall(self._event_callback)) def __del__(self) -> None: pass @@ -811,7 +811,7 @@ class AwaitGamepadInputWindow(ba.Window): # This strong-refs us; killing it allow us to die now. self._decrement_timer = None - _ba.release_gamepad_input() + ba.internal.release_gamepad_input() if self._root_widget: ba.containerwidget(edit=self._root_widget, transition='out_scale') diff --git a/assets/src/ba_data/python/bastd/ui/settings/gamepadselect.py b/assets/src/ba_data/python/bastd/ui/settings/gamepadselect.py index 8053fe30..65bdf267 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/gamepadselect.py +++ b/assets/src/ba_data/python/bastd/ui/settings/gamepadselect.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -21,7 +21,7 @@ def gamepad_configure_callback(event: dict[str, Any]) -> None: # Ignore all but button-presses. if event['type'] not in ['BUTTONDOWN', 'HATMOTION']: return - _ba.release_gamepad_input() + ba.internal.release_gamepad_input() try: ba.app.ui.clear_main_menu_window(transition='out_left') except Exception: @@ -140,11 +140,11 @@ class GamepadSelectWindow(ba.Window): h_align='center', v_align='top') - _ba.capture_gamepad_input(gamepad_configure_callback) + ba.internal.capture_gamepad_input(gamepad_configure_callback) def _back(self) -> None: from bastd.ui.settings import controls - _ba.release_gamepad_input() + ba.internal.release_gamepad_input() ba.containerwidget(edit=self._root_widget, transition='out_right') ba.app.ui.set_main_menu_window( controls.ControlsSettingsWindow( diff --git a/assets/src/ba_data/python/bastd/ui/settings/graphics.py b/assets/src/ba_data/python/bastd/ui/settings/graphics.py index 8d0fff06..09eb1f20 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/graphics.py +++ b/assets/src/ba_data/python/bastd/ui/settings/graphics.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -52,7 +52,7 @@ class GraphicsSettingsWindow(ba.Window): show_gamma = False gamma_spacing = spacing * 1.3 - if _ba.has_gamma_control(): + if ba.internal.has_gamma_control(): show_gamma = True height += gamma_spacing @@ -137,7 +137,8 @@ class GraphicsSettingsWindow(ba.Window): textscale=0.85) if ba.app.ui.use_toolbars: ba.widget(edit=gmc.plusbutton, - right_widget=_ba.get_special_widget('party_button')) + right_widget=ba.internal.get_special_widget( + 'party_button')) if not self._have_selected_child: ba.containerwidget(edit=self._root_widget, selected_child=gmc.minusbutton) @@ -166,7 +167,7 @@ class GraphicsSettingsWindow(ba.Window): scale=popup_menu_scale, choices=['Auto', 'Higher', 'High', 'Medium', 'Low'], choices_disabled=['Higher', 'High'] - if _ba.get_max_graphics_quality() == 'Medium' else [], + if ba.internal.get_max_graphics_quality() == 'Medium' else [], choices_display=[ ba.Lstr(resource='autoText'), ba.Lstr(resource=self._r + '.higherText'), @@ -202,8 +203,9 @@ class GraphicsSettingsWindow(ba.Window): current_choice=ba.app.config.resolve('Texture Quality'), on_value_change_call=self._set_textures) if ba.app.ui.use_toolbars: - ba.widget(edit=textures_popup.get_button(), - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=textures_popup.get_button(), + right_widget=ba.internal.get_special_widget('party_button')) v -= 80 h_offs = 0 @@ -238,7 +240,7 @@ class GraphicsSettingsWindow(ba.Window): current_choice=current_res_cardboard, on_value_change_call=self._set_gvr_render_target_scale) else: - native_res = _ba.get_display_resolution() + native_res = ba.internal.get_display_resolution() assert native_res is not None choices = ['Auto', 'Native'] choices_display = [ @@ -265,7 +267,7 @@ class GraphicsSettingsWindow(ba.Window): else: # if we're on a system that doesn't allow setting resolution, # set pixel-scale instead - current_res = _ba.get_display_resolution() + current_res = ba.internal.get_display_resolution() if current_res is None: current_res2 = (str(min(100, max(10, int(round( ba.app.config.resolve('Screen Pixel Scale') diff --git a/assets/src/ba_data/python/bastd/ui/settings/keyboard.py b/assets/src/ba_data/python/bastd/ui/settings/keyboard.py index 2e93f1fc..4a2d056d 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/keyboard.py +++ b/assets/src/ba_data/python/bastd/ui/settings/keyboard.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -281,10 +281,10 @@ class AwaitKeyboardInputWindow(ba.Window): text=str(self._counter)) self._decrement_timer: ba.Timer | None = ba.Timer( 1.0, self._decrement, repeat=True, timetype=ba.TimeType.REAL) - _ba.capture_keyboard_input(ba.WeakCall(self._button_callback)) + ba.internal.capture_keyboard_input(ba.WeakCall(self._button_callback)) def __del__(self) -> None: - _ba.release_keyboard_input() + ba.internal.release_keyboard_input() def _die(self) -> None: # This strong-refs us; killing it allows us to die now. diff --git a/assets/src/ba_data/python/bastd/ui/settings/nettesting.py b/assets/src/ba_data/python/bastd/ui/settings/nettesting.py index 85788dbe..9ea4c9b5 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/nettesting.py +++ b/assets/src/ba_data/python/bastd/ui/settings/nettesting.py @@ -11,7 +11,6 @@ from threading import Thread from typing import TYPE_CHECKING from efro.error import CleanError -import _ba import ba import ba.internal from bastd.ui.settings.testing import TestingWindow @@ -165,7 +164,7 @@ def _run_diagnostics(weakwin: weakref.ref[NetTestingWindow]) -> None: try: _print(f'Running network diagnostics...\n' - f'ua: {_ba.app.user_agent_string}\n' + f'ua: {ba.app.user_agent_string}\n' f'time: {utc_now()}.') if bool(False): @@ -344,7 +343,7 @@ def _test_fetch(baseaddr: str) -> None: import urllib.request response = urllib.request.urlopen( urllib.request.Request(f'{baseaddr}/ping', None, - {'User-Agent': _ba.app.user_agent_string}), + {'User-Agent': ba.app.user_agent_string}), context=ba.app.net.sslcontext, timeout=MAX_TEST_SECONDS, ) diff --git a/assets/src/ba_data/python/bastd/ui/settings/testing.py b/assets/src/ba_data/python/bastd/ui/settings/testing.py index d1f7fb6d..53b63afb 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/testing.py +++ b/assets/src/ba_data/python/bastd/ui/settings/testing.py @@ -7,8 +7,8 @@ from __future__ import annotations import copy from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -96,7 +96,7 @@ class TestingWindow(ba.Window): # we can reset if we want.. if entry_name not in ba.app.value_test_defaults: ba.app.value_test_defaults[entry_name] = ( - _ba.value_test(entry_name)) + ba.internal.value_test(entry_name)) ba.textwidget(parent=self._subcontainer, position=(h, v), @@ -125,7 +125,7 @@ class TestingWindow(ba.Window): v_align='center', maxwidth=60, text='%.4g' % - _ba.value_test(entry_name)) + ba.internal.value_test(entry_name)) btn = ba.buttonwidget(parent=self._subcontainer, position=(h + 140, v - 19), size=(40, 40), @@ -156,25 +156,26 @@ class TestingWindow(ba.Window): def _on_reset_press(self) -> None: for entry in self._entries: - _ba.value_test(entry['name'], - absolute=ba.app.value_test_defaults[entry['name']]) + ba.internal.value_test( + entry['name'], + absolute=ba.app.value_test_defaults[entry['name']]) # pylint: disable=consider-using-f-string ba.textwidget(edit=entry['widget'], - text='%.4g' % _ba.value_test(entry['name'])) + text='%.4g' % ba.internal.value_test(entry['name'])) def _on_minus_press(self, entry_name: str) -> None: entry = self._get_entry(entry_name) - _ba.value_test(entry['name'], change=-entry['increment']) + ba.internal.value_test(entry['name'], change=-entry['increment']) # pylint: disable=consider-using-f-string ba.textwidget(edit=entry['widget'], - text='%.4g' % _ba.value_test(entry['name'])) + text='%.4g' % ba.internal.value_test(entry['name'])) def _on_plus_press(self, entry_name: str) -> None: entry = self._get_entry(entry_name) - _ba.value_test(entry['name'], change=entry['increment']) + ba.internal.value_test(entry['name'], change=entry['increment']) # pylint: disable=consider-using-f-string ba.textwidget(edit=entry['widget'], - text='%.4g' % _ba.value_test(entry['name'])) + text='%.4g' % ba.internal.value_test(entry['name'])) def _do_back(self) -> None: # pylint: disable=cyclic-import diff --git a/assets/src/ba_data/python/bastd/ui/settings/touchscreen.py b/assets/src/ba_data/python/bastd/ui/settings/touchscreen.py index ddf43464..f8d7979a 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/touchscreen.py +++ b/assets/src/ba_data/python/bastd/ui/settings/touchscreen.py @@ -3,8 +3,8 @@ """UI settings functionality related to touchscreens.""" from __future__ import annotations -import _ba import ba +import ba.internal class TouchscreenSettingsWindow(ba.Window): @@ -16,7 +16,7 @@ class TouchscreenSettingsWindow(ba.Window): # FIXME: Could switch to a UI destroy callback now that those are a # thing that exists. - _ba.set_touchscreen_editing(False) + ba.internal.set_touchscreen_editing(False) def __init__(self) -> None: @@ -25,7 +25,7 @@ class TouchscreenSettingsWindow(ba.Window): self._spacing = 40 self._r = 'configTouchscreenWindow' - _ba.set_touchscreen_editing(True) + ba.internal.set_touchscreen_editing(True) uiscale = ba.app.ui.uiscale super().__init__(root_widget=ba.containerwidget( @@ -233,4 +233,4 @@ class TouchscreenSettingsWindow(ba.Window): ba.app.ui.set_main_menu_window( controls.ControlsSettingsWindow( transition='in_left').get_root_widget()) - _ba.set_touchscreen_editing(False) + ba.internal.set_touchscreen_editing(False) diff --git a/assets/src/ba_data/python/bastd/ui/settings/xbox360controller.py b/assets/src/ba_data/python/bastd/ui/settings/xbox360controller.py index 0e145a70..bdec91d3 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/xbox360controller.py +++ b/assets/src/ba_data/python/bastd/ui/settings/xbox360controller.py @@ -6,8 +6,8 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: pass @@ -19,7 +19,7 @@ class XBox360ControllerSettingsWindow(ba.Window): def __init__(self) -> None: self._r = 'xbox360ControllersWindow' width = 700 - height = 300 if _ba.is_running_on_fire_tv() else 485 + height = 300 if ba.internal.is_running_on_fire_tv() else 485 spacing = 40 uiscale = ba.app.ui.uiscale super().__init__(root_widget=ba.containerwidget( @@ -58,7 +58,7 @@ class XBox360ControllerSettingsWindow(ba.Window): v = height - 70 v -= spacing - if _ba.is_running_on_fire_tv(): + if ba.internal.is_running_on_fire_tv(): ba.textwidget(parent=self._root_widget, position=(width * 0.5, height * 0.47), size=(0, 0), diff --git a/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py b/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py index b208815c..a4bf0dde 100644 --- a/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py +++ b/assets/src/ba_data/python/bastd/ui/soundtrack/browser.py @@ -7,8 +7,8 @@ from __future__ import annotations import copy from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -105,8 +105,9 @@ class SoundtrackBrowserWindow(ba.Window): texture=lock_tex)) if self._back_button is None: - ba.widget(edit=btn, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=btn, + left_widget=ba.internal.get_special_widget('back_button')) v -= 60.0 * scl self._edit_button = btn = ba.buttonwidget( @@ -127,8 +128,9 @@ class SoundtrackBrowserWindow(ba.Window): position=(h - 10, v + 55.0 * scl - 28), texture=lock_tex)) if self._back_button is None: - ba.widget(edit=btn, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=btn, + left_widget=ba.internal.get_special_widget('back_button')) v -= 60.0 * scl self._duplicate_button = btn = ba.buttonwidget( @@ -149,8 +151,9 @@ class SoundtrackBrowserWindow(ba.Window): position=(h - 10, v + 55.0 * scl - 28), texture=lock_tex)) if self._back_button is None: - ba.widget(edit=btn, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=btn, + left_widget=ba.internal.get_special_widget('back_button')) v -= 60.0 * scl self._delete_button = btn = ba.buttonwidget( @@ -171,8 +174,9 @@ class SoundtrackBrowserWindow(ba.Window): position=(h - 10, v + 55.0 * scl - 28), texture=lock_tex)) if self._back_button is None: - ba.widget(edit=btn, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=btn, + left_widget=ba.internal.get_special_widget('back_button')) # Keep our lock images up to date/etc. self._update_timer = ba.Timer(1.0, @@ -191,7 +195,7 @@ class SoundtrackBrowserWindow(ba.Window): size=(self._width - (205 + 2 * x_inset), scroll_height)) ba.widget(edit=self._scrollwidget, left_widget=self._new_button, - right_widget=_ba.get_special_widget('party_button') + right_widget=ba.internal.get_special_widget('party_button') if ba.app.ui.use_toolbars else self._scrollwidget) self._col = ba.columnwidget(parent=scrollwidget, border=2, margin=0) diff --git a/assets/src/ba_data/python/bastd/ui/soundtrack/entrytypeselect.py b/assets/src/ba_data/python/bastd/ui/soundtrack/entrytypeselect.py index acfdef22..e009b251 100644 --- a/assets/src/ba_data/python/bastd/ui/soundtrack/entrytypeselect.py +++ b/assets/src/ba_data/python/bastd/ui/soundtrack/entrytypeselect.py @@ -6,8 +6,8 @@ from __future__ import annotations import copy from typing import TYPE_CHECKING -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any, Callable @@ -160,7 +160,7 @@ class SoundtrackEntryTypeSelectWindow(ba.Window): from ba.osmusic import OSMusicPlayer from bastd.ui.fileselector import FileSelectorWindow ba.containerwidget(edit=self._root_widget, transition='out_left') - base_path = _ba.android_get_external_files_dir() + base_path = ba.internal.android_get_external_files_dir() ba.app.ui.set_main_menu_window( FileSelectorWindow( base_path, @@ -173,7 +173,7 @@ class SoundtrackEntryTypeSelectWindow(ba.Window): def _on_music_folder_press(self) -> None: from bastd.ui.fileselector import FileSelectorWindow ba.containerwidget(edit=self._root_widget, transition='out_left') - base_path = _ba.android_get_external_files_dir() + base_path = ba.internal.android_get_external_files_dir() ba.app.ui.set_main_menu_window( FileSelectorWindow(base_path, callback=self._music_folder_selector_cb, diff --git a/assets/src/ba_data/python/bastd/ui/specialoffer.py b/assets/src/ba_data/python/bastd/ui/specialoffer.py index 2a533245..1935f3b3 100644 --- a/assets/src/ba_data/python/bastd/ui/specialoffer.py +++ b/assets/src/ba_data/python/bastd/ui/specialoffer.py @@ -7,7 +7,6 @@ from __future__ import annotations import copy from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -65,8 +64,8 @@ class SpecialOfferWindow(ba.Window): return # This can pop up suddenly, so lets block input for 1 second. - _ba.lock_all_input() - ba.timer(1.0, _ba.unlock_all_input, timetype=ba.TimeType.REAL) + ba.internal.lock_all_input() + ba.timer(1.0, ba.internal.unlock_all_input, timetype=ba.TimeType.REAL) ba.playsound(ba.getsound('ding')) ba.timer(0.3, lambda: ba.playsound(ba.getsound('ooh')), @@ -342,7 +341,7 @@ class SpecialOfferWindow(ba.Window): # We go away if we see that our target item is owned. if self._offer_item == 'pro': - if _ba.app.accounts_v1.have_pro(): + if ba.app.accounts_v1.have_pro(): can_die = True else: if ba.internal.get_purchased(self._offer_item): diff --git a/assets/src/ba_data/python/bastd/ui/store/browser.py b/assets/src/ba_data/python/bastd/ui/store/browser.py index f39f0de8..e2471b79 100644 --- a/assets/src/ba_data/python/bastd/ui/store/browser.py +++ b/assets/src/ba_data/python/bastd/ui/store/browser.py @@ -10,7 +10,6 @@ import weakref from enum import Enum from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -272,9 +271,10 @@ class StoreBrowserWindow(ba.Window): def _update_get_tickets_button_pos(self) -> None: uiscale = ba.app.ui.uiscale - pos = (self._width - 252 - (self._x_inset + - (47 if uiscale is ba.UIScale.SMALL - and _ba.is_party_icon_visible() else 0)), + pos = (self._width - 252 - + (self._x_inset + + (47 if uiscale is ba.UIScale.SMALL + and ba.internal.is_party_icon_visible() else 0)), self._height - 70) if self._get_tickets_button: ba.buttonwidget(edit=self._get_tickets_button, position=pos) @@ -560,7 +560,7 @@ class StoreBrowserWindow(ba.Window): for b_type, b_info in self.button_infos.items(): if b_type in ['upgrades.pro', 'pro']: - purchased = _ba.app.accounts_v1.have_pro() + purchased = ba.app.accounts_v1.have_pro() else: purchased = ba.internal.get_purchased(b_type) diff --git a/assets/src/ba_data/python/bastd/ui/store/button.py b/assets/src/ba_data/python/bastd/ui/store/button.py index 06d996ee..b9d4bf8f 100644 --- a/assets/src/ba_data/python/bastd/ui/store/button.py +++ b/assets/src/ba_data/python/bastd/ui/store/button.py @@ -5,7 +5,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal @@ -146,7 +145,7 @@ class StoreButton: self._update() def _on_activate(self) -> None: - _ba.increment_analytics_count('Store button press') + ba.internal.increment_analytics_count('Store button press') self._on_activate_call() def set_position(self, position: Sequence[float]) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/telnet.py b/assets/src/ba_data/python/bastd/ui/telnet.py index 8ea63e4e..0c7080ca 100644 --- a/assets/src/ba_data/python/bastd/ui/telnet.py +++ b/assets/src/ba_data/python/bastd/ui/telnet.py @@ -4,8 +4,8 @@ from __future__ import annotations -import _ba import ba +import ba.internal class TelnetAccessRequestWindow(ba.Window): @@ -45,9 +45,9 @@ class TelnetAccessRequestWindow(ba.Window): def _cancel(self) -> None: ba.containerwidget(edit=self._root_widget, transition='out_right') - _ba.set_telnet_access_enabled(False) + ba.internal.set_telnet_access_enabled(False) def _ok(self) -> None: ba.containerwidget(edit=self._root_widget, transition='out_left') - _ba.set_telnet_access_enabled(True) + ba.internal.set_telnet_access_enabled(True) ba.screenmessage(ba.Lstr(resource='telnetAccessGrantedText')) diff --git a/assets/src/ba_data/python/bastd/ui/tournamententry.py b/assets/src/ba_data/python/bastd/ui/tournamententry.py index 2f9d5a14..f5437558 100644 --- a/assets/src/ba_data/python/bastd/ui/tournamententry.py +++ b/assets/src/ba_data/python/bastd/ui/tournamententry.py @@ -6,7 +6,6 @@ from __future__ import annotations from typing import TYPE_CHECKING -import _ba import ba import ba.internal from bastd.ui import popup @@ -89,7 +88,7 @@ class TournamentEntryWindow(popup.PopupWindow): self._launched = False # Show the ad button only if we support ads *and* it has a level 1 fee. - self._do_ad_btn = (_ba.has_video_ads() and self._allow_ads) + self._do_ad_btn = (ba.internal.has_video_ads() and self._allow_ads) x_offs = 0 if self._do_ad_btn else 85 @@ -404,7 +403,7 @@ class TournamentEntryWindow(popup.PopupWindow): if self._purchase_price == 0 else self._ticket_img_pos) if self._do_ad_btn: - enabled = _ba.have_incentivized_ad() + enabled = ba.internal.have_incentivized_ad() have_ad_tries_remaining = ( self._tournament_info['adTriesRemaining'] is not None and self._tournament_info['adTriesRemaining'] > 0) @@ -561,9 +560,9 @@ class TournamentEntryWindow(popup.PopupWindow): cur_time = ba.time(ba.TimeType.REAL) if cur_time - self._last_ad_press_time > 5.0: self._last_ad_press_time = cur_time - _ba.app.ads.show_ad_2('tournament_entry', - on_completion_call=ba.WeakCall( - self._on_ad_complete)) + ba.app.ads.show_ad_2('tournament_entry', + on_completion_call=ba.WeakCall( + self._on_ad_complete)) def _on_ad_complete(self, actually_showed: bool) -> None: diff --git a/assets/src/ba_data/python/bastd/ui/url.py b/assets/src/ba_data/python/bastd/ui/url.py index 00f3b30a..fe90fb3a 100644 --- a/assets/src/ba_data/python/bastd/ui/url.py +++ b/assets/src/ba_data/python/bastd/ui/url.py @@ -4,8 +4,8 @@ from __future__ import annotations -import _ba import ba +import ba.internal class ShowURLWindow(ba.Window): @@ -41,7 +41,7 @@ class ShowURLWindow(ba.Window): position=(self._width * 0.5 - qr_size * 0.5, self._height * 0.5 - qr_size * 0.5), size=(qr_size, qr_size), - texture=_ba.get_qrcode_texture(address)) + texture=ba.internal.get_qrcode_texture(address)) ba.containerwidget(edit=self._root_widget, cancel_button=self._cancel_button) else: diff --git a/assets/src/ba_data/python/bastd/ui/watch.py b/assets/src/ba_data/python/bastd/ui/watch.py index 296bc369..eca946b9 100644 --- a/assets/src/ba_data/python/bastd/ui/watch.py +++ b/assets/src/ba_data/python/bastd/ui/watch.py @@ -8,8 +8,8 @@ import os from enum import Enum from typing import TYPE_CHECKING, cast -import _ba import ba +import ba.internal if TYPE_CHECKING: from typing import Any @@ -114,10 +114,11 @@ class WatchWindow(ba.Window): if ba.app.ui.use_toolbars: first_tab = self._tab_row.tabs[tabdefs[0][0]] last_tab = self._tab_row.tabs[tabdefs[-1][0]] - ba.widget(edit=last_tab.button, - right_widget=_ba.get_special_widget('party_button')) + ba.widget( + edit=last_tab.button, + right_widget=ba.internal.get_special_widget('party_button')) if uiscale is ba.UIScale.SMALL: - bbtn = _ba.get_special_widget('back_button') + bbtn = ba.internal.get_special_widget('back_button') ba.widget(edit=first_tab.button, up_widget=bbtn, left_widget=bbtn) @@ -224,8 +225,9 @@ class WatchWindow(ba.Window): autoselect=True) ba.widget(edit=btn1, up_widget=self._tab_row.tabs[tab_id].button) if uiscale is ba.UIScale.SMALL and ba.app.ui.use_toolbars: - ba.widget(edit=btn1, - left_widget=_ba.get_special_widget('back_button')) + ba.widget( + edit=btn1, + left_widget=ba.internal.get_special_widget('back_button')) btnv -= b_height + b_space_extra ba.buttonwidget(parent=cnt, size=(b_width, b_height), @@ -282,25 +284,25 @@ class WatchWindow(ba.Window): if self._my_replay_selected is None: self._no_replay_selected_error() return - _ba.increment_analytics_count('Replay watch') + ba.internal.increment_analytics_count('Replay watch') def do_it() -> None: try: # Reset to normal speed. - _ba.set_replay_speed_exponent(0) - _ba.fade_screen(True) + ba.internal.set_replay_speed_exponent(0) + ba.internal.fade_screen(True) assert self._my_replay_selected is not None - _ba.new_replay_session(_ba.get_replays_dir() + '/' + - self._my_replay_selected) + ba.internal.new_replay_session(ba.internal.get_replays_dir() + + '/' + self._my_replay_selected) except Exception: ba.print_exception('Error running replay session.') # Drop back into a fresh main menu session # in case we half-launched or something. from bastd import mainmenu - _ba.new_host_session(mainmenu.MainMenuSession) + ba.internal.new_host_session(mainmenu.MainMenuSession) - _ba.fade_screen(False, endcall=ba.Call(ba.pushcall, do_it)) + ba.internal.fade_screen(False, endcall=ba.Call(ba.pushcall, do_it)) ba.containerwidget(edit=self._root_widget, transition='out_left') def _on_my_replay_rename_press(self) -> None: @@ -371,9 +373,9 @@ class WatchWindow(ba.Window): # (or what it looks like to the user). if (replay != new_name and self._get_replay_display_name(replay) != new_name_raw): - old_name_full = (_ba.get_replays_dir() + '/' + + old_name_full = (ba.internal.get_replays_dir() + '/' + replay).encode('utf-8') - new_name_full = (_ba.get_replays_dir() + '/' + + new_name_full = (ba.internal.get_replays_dir() + '/' + new_name).encode('utf-8') # False alarm; ba.textwidget can return non-None val. # pylint: disable=unsupported-membership-test @@ -389,7 +391,7 @@ class WatchWindow(ba.Window): '.replayRenameErrorInvalidName'), color=(1, 0, 0)) else: - _ba.increment_analytics_count('Replay rename') + ba.internal.increment_analytics_count('Replay rename') os.rename(old_name_full, new_name_full) self._refresh_my_replays() ba.playsound(ba.getsound('gunCocking')) @@ -426,8 +428,9 @@ class WatchWindow(ba.Window): def _delete_replay(self, replay: str) -> None: try: - _ba.increment_analytics_count('Replay delete') - os.remove((_ba.get_replays_dir() + '/' + replay).encode('utf-8')) + ba.internal.increment_analytics_count('Replay delete') + os.remove( + (ba.internal.get_replays_dir() + '/' + replay).encode('utf-8')) self._refresh_my_replays() ba.playsound(ba.getsound('shieldDown')) if replay == self._my_replay_selected: @@ -449,7 +452,7 @@ class WatchWindow(ba.Window): child.delete() t_scale = 1.6 try: - names = os.listdir(_ba.get_replays_dir()) + names = os.listdir(ba.internal.get_replays_dir()) # Ignore random other files in there. names = [n for n in names if n.endswith('.brp')] diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index bc9cd2c7..304f57b4 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -22,7 +22,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20770; +const int kAppBuildNumber = 20772; const char* kAppVersion = "1.7.7"; // Our standalone globals. diff --git a/src/ballistica/platform/platform.cc b/src/ballistica/platform/platform.cc index 1b6b9511..4a7dd8f0 100644 --- a/src/ballistica/platform/platform.cc +++ b/src/ballistica/platform/platform.cc @@ -599,7 +599,9 @@ static void HandleArgs(int argc, char** argv) { if (explicit_bool(true)) { invalid_ptr = nullptr; } - *invalid_ptr = 1; + if (explicit_bool(true)) { + *invalid_ptr = 1; + } } else if (!strcmp(argv[i], "-cfgdir")) { if (i + 1 < argc) { g_app_globals->user_config_dir = argv[i + 1]; diff --git a/tools/batools/project.py b/tools/batools/project.py index 4d8898bf..507b8ebe 100755 --- a/tools/batools/project.py +++ b/tools/batools/project.py @@ -349,6 +349,7 @@ class Updater: f'Priv or pub legal not found in {fname}.') def _check_python_file(self, fname: str) -> None: + # pylint: disable=too-many-branches from efrotools import get_public_license, PYVER with open(fname, encoding='utf-8') as infile: contents = infile.read() @@ -375,6 +376,22 @@ class Updater: if lines[copyrightline].startswith('# Synced from '): copyrightline += 3 + for i, line in enumerate(lines): + # stuff under the ba module. + if '/ba/' in fname: + # Don't allow importing ba at the top level from within ba. + if line == 'import ba': + raise CleanError( + f'{fname}:{i+1}: no top level ba imports allowed' + f' under ba module.') + if '/bastd/' in fname: + # Don't allow importing _ba or _bainternal anywhere here. + # (any internal needs should be in ba.internal) + if 'import _ba' in line: + raise CleanError( + f'{fname}:{i+1}: _ba or _bainternal imports not' + f' allowed under bastd.') + # In all cases, look for our one-line legal notice. # In the public case, look for the rest of our public license too. if self._license_line_checks: