diff --git a/src/assets/.asset_manifest_public.json b/src/assets/.asset_manifest_public.json index 77a4d8a3..5180433c 100644 --- a/src/assets/.asset_manifest_public.json +++ b/src/assets/.asset_manifest_public.json @@ -66,13 +66,9 @@ "ba_data/python/baclassic/__pycache__/_analytics.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_appdelegate.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_benchmark.cpython-311.opt-1.pyc", - "ba_data/python/baclassic/__pycache__/_campaign.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_input.cpython-311.opt-1.pyc", - "ba_data/python/baclassic/__pycache__/_level.cpython-311.opt-1.pyc", - "ba_data/python/baclassic/__pycache__/_lobby.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_music.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_net.cpython-311.opt-1.pyc", - "ba_data/python/baclassic/__pycache__/_profile.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_servermode.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_store.cpython-311.opt-1.pyc", "ba_data/python/baclassic/__pycache__/_subsystem.cpython-311.opt-1.pyc", @@ -87,13 +83,9 @@ "ba_data/python/baclassic/_analytics.py", "ba_data/python/baclassic/_appdelegate.py", "ba_data/python/baclassic/_benchmark.py", - "ba_data/python/baclassic/_campaign.py", "ba_data/python/baclassic/_input.py", - "ba_data/python/baclassic/_level.py", - "ba_data/python/baclassic/_lobby.py", "ba_data/python/baclassic/_music.py", "ba_data/python/baclassic/_net.py", - "ba_data/python/baclassic/_profile.py", "ba_data/python/baclassic/_servermode.py", "ba_data/python/baclassic/_store.py", "ba_data/python/baclassic/_subsystem.py", @@ -133,6 +125,7 @@ "ba_data/python/bascenev1/__pycache__/_activitytypes.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_actor.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_appmode.cpython-311.opt-1.pyc", + "ba_data/python/bascenev1/__pycache__/_campaign.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_collision.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_coopgame.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_coopsession.cpython-311.opt-1.pyc", @@ -145,6 +138,8 @@ "ba_data/python/bascenev1/__pycache__/_gameresults.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_gameutils.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_hooks.cpython-311.opt-1.pyc", + "ba_data/python/bascenev1/__pycache__/_level.cpython-311.opt-1.pyc", + "ba_data/python/bascenev1/__pycache__/_lobby.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_map.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_messages.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_multiteamsession.cpython-311.opt-1.pyc", @@ -153,6 +148,7 @@ "ba_data/python/bascenev1/__pycache__/_player.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_playlist.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_powerup.cpython-311.opt-1.pyc", + "ba_data/python/bascenev1/__pycache__/_profile.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_score.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_session.cpython-311.opt-1.pyc", "ba_data/python/bascenev1/__pycache__/_settings.cpython-311.opt-1.pyc", @@ -164,6 +160,7 @@ "ba_data/python/bascenev1/_activitytypes.py", "ba_data/python/bascenev1/_actor.py", "ba_data/python/bascenev1/_appmode.py", + "ba_data/python/bascenev1/_campaign.py", "ba_data/python/bascenev1/_collision.py", "ba_data/python/bascenev1/_coopgame.py", "ba_data/python/bascenev1/_coopsession.py", @@ -176,6 +173,8 @@ "ba_data/python/bascenev1/_gameresults.py", "ba_data/python/bascenev1/_gameutils.py", "ba_data/python/bascenev1/_hooks.py", + "ba_data/python/bascenev1/_level.py", + "ba_data/python/bascenev1/_lobby.py", "ba_data/python/bascenev1/_map.py", "ba_data/python/bascenev1/_messages.py", "ba_data/python/bascenev1/_multiteamsession.py", @@ -184,6 +183,7 @@ "ba_data/python/bascenev1/_player.py", "ba_data/python/bascenev1/_playlist.py", "ba_data/python/bascenev1/_powerup.py", + "ba_data/python/bascenev1/_profile.py", "ba_data/python/bascenev1/_score.py", "ba_data/python/bascenev1/_session.py", "ba_data/python/bascenev1/_settings.py", diff --git a/src/assets/Makefile b/src/assets/Makefile index 86319938..8e9795e2 100644 --- a/src/assets/Makefile +++ b/src/assets/Makefile @@ -181,13 +181,9 @@ SCRIPT_TARGETS_PY_PUBLIC = \ $(BUILD_DIR)/ba_data/python/baclassic/_analytics.py \ $(BUILD_DIR)/ba_data/python/baclassic/_appdelegate.py \ $(BUILD_DIR)/ba_data/python/baclassic/_benchmark.py \ - $(BUILD_DIR)/ba_data/python/baclassic/_campaign.py \ $(BUILD_DIR)/ba_data/python/baclassic/_input.py \ - $(BUILD_DIR)/ba_data/python/baclassic/_level.py \ - $(BUILD_DIR)/ba_data/python/baclassic/_lobby.py \ $(BUILD_DIR)/ba_data/python/baclassic/_music.py \ $(BUILD_DIR)/ba_data/python/baclassic/_net.py \ - $(BUILD_DIR)/ba_data/python/baclassic/_profile.py \ $(BUILD_DIR)/ba_data/python/baclassic/_servermode.py \ $(BUILD_DIR)/ba_data/python/baclassic/_store.py \ $(BUILD_DIR)/ba_data/python/baclassic/_subsystem.py \ @@ -205,6 +201,7 @@ SCRIPT_TARGETS_PY_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bascenev1/_activitytypes.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_actor.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_appmode.py \ + $(BUILD_DIR)/ba_data/python/bascenev1/_campaign.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_collision.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_coopgame.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_coopsession.py \ @@ -217,6 +214,8 @@ SCRIPT_TARGETS_PY_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bascenev1/_gameresults.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_gameutils.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_hooks.py \ + $(BUILD_DIR)/ba_data/python/bascenev1/_level.py \ + $(BUILD_DIR)/ba_data/python/bascenev1/_lobby.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_map.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_messages.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_multiteamsession.py \ @@ -225,6 +224,7 @@ SCRIPT_TARGETS_PY_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bascenev1/_player.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_playlist.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_powerup.py \ + $(BUILD_DIR)/ba_data/python/bascenev1/_profile.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_score.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_session.py \ $(BUILD_DIR)/ba_data/python/bascenev1/_settings.py \ @@ -453,13 +453,9 @@ SCRIPT_TARGETS_PYC_PUBLIC = \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_analytics.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_appdelegate.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_benchmark.cpython-311.opt-1.pyc \ - $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_campaign.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_input.cpython-311.opt-1.pyc \ - $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_level.cpython-311.opt-1.pyc \ - $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_lobby.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_music.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_net.cpython-311.opt-1.pyc \ - $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_profile.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_servermode.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_store.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/baclassic/__pycache__/_subsystem.cpython-311.opt-1.pyc \ @@ -477,6 +473,7 @@ SCRIPT_TARGETS_PYC_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_activitytypes.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_actor.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_appmode.cpython-311.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_campaign.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_collision.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_coopgame.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_coopsession.cpython-311.opt-1.pyc \ @@ -489,6 +486,8 @@ SCRIPT_TARGETS_PYC_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_gameresults.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_gameutils.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_hooks.cpython-311.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_level.cpython-311.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_lobby.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_map.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_messages.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_multiteamsession.cpython-311.opt-1.pyc \ @@ -497,6 +496,7 @@ SCRIPT_TARGETS_PYC_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_player.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_playlist.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_powerup.cpython-311.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_profile.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_score.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_session.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bascenev1/__pycache__/_settings.cpython-311.opt-1.pyc \ diff --git a/src/assets/ba_data/python/baclassic/__init__.py b/src/assets/ba_data/python/baclassic/__init__.py index 145e272c..aaa77a86 100644 --- a/src/assets/ba_data/python/baclassic/__init__.py +++ b/src/assets/ba_data/python/baclassic/__init__.py @@ -31,17 +31,10 @@ directly, it will most likely not work without classic present. import logging from baclassic._subsystem import ClassicSubsystem -from baclassic._campaign import Campaign -from baclassic._level import Level -from baclassic._lobby import Lobby, Chooser from baclassic._achievement import Achievement, AchievementSubsystem __all__ = [ 'ClassicSubsystem', - 'Campaign', - 'Level', - 'Lobby', - 'Chooser', 'Achievement', 'AchievementSubsystem', ] diff --git a/src/assets/ba_data/python/baclassic/_subsystem.py b/src/assets/ba_data/python/baclassic/_subsystem.py index f325ba51..567605db 100644 --- a/src/assets/ba_data/python/baclassic/_subsystem.py +++ b/src/assets/ba_data/python/baclassic/_subsystem.py @@ -16,6 +16,7 @@ import bascenev1 from babase._general import Call from babase._appsubsystem import AppSubsystem from babase._general import AppTime +from bascenev1 import _profile import _baclassic from baclassic._music import MusicSubsystem from baclassic._accountv1 import AccountV1Subsystem @@ -26,12 +27,12 @@ from baclassic._tips import get_all_tips from baclassic._store import StoreSubsystem from baclassic._ui import UISubsystem from baclassic import _input -from baclassic import _profile if TYPE_CHECKING: from typing import Callable, Any, Sequence import babase + import bauiv1 import baclassic from bastd.actor import spazappearance from baclassic._appdelegate import AppDelegate @@ -54,9 +55,9 @@ class ClassicSubsystem(AppSubsystem): # baclassic/__init__.py. This way this version can be used for # runtime via babase.app.classic which enforces handling of the # package-not-present case. - from baclassic._level import Level - from baclassic._campaign import Campaign - from baclassic._lobby import Lobby, Chooser + from bascenev1._level import Level + from bascenev1._campaign import Campaign + from bascenev1._lobby import Lobby, Chooser from baclassic._music import MusicPlayMode # FIXME move 2 subsys def __init__(self) -> None: @@ -71,7 +72,7 @@ class ClassicSubsystem(AppSubsystem): self.ui = UISubsystem() # Co-op Campaigns. - self.campaigns: dict[str, baclassic.Campaign] = {} + self.campaigns: dict[str, bascenev1.Campaign] = {} self.custom_coop_practice_games: list[str] = [] # Lobby. @@ -169,7 +170,7 @@ class ClassicSubsystem(AppSubsystem): def on_app_launching(self) -> None: """Called when the app is first entering the launching state.""" # pylint: disable=too-many-locals - from baclassic import _campaign + from bascenev1 import _campaign from bascenev1 import _map from bastd.actor import spazappearance from bastd import maps as stdmaps @@ -325,7 +326,7 @@ class ClassicSubsystem(AppSubsystem): # FIXME: This should not be an actor attr. activity.paused_text = None - def add_coop_practice_level(self, level: baclassic.Level) -> None: + def add_coop_practice_level(self, level: bascenev1.Level) -> None: """Adds an individual level to the 'practice' section in Co-op.""" # Assign this level to our catch-all campaign. @@ -523,7 +524,7 @@ class ClassicSubsystem(AppSubsystem): return _tournament.get_tournament_prize_strings(entry) - def getcampaign(self, name: str) -> baclassic.Campaign: + def getcampaign(self, name: str) -> bascenev1.Campaign: """Return a campaign by name.""" return self.campaigns[name] @@ -751,6 +752,14 @@ class ClassicSubsystem(AppSubsystem): return TeamSeriesVictoryScoreScreenActivity + def get_team_victory_score_screen_activity( + self, + ) -> type[bascenev1.Activity]: + """(internal)""" + from bastd.activity.dualteamscore import TeamVictoryScoreScreenActivity + + return TeamVictoryScoreScreenActivity + def get_free_for_all_victory_score_screen_activity( self, ) -> type[bascenev1.Activity]: @@ -760,3 +769,82 @@ class ClassicSubsystem(AppSubsystem): ) return FreeForAllVictoryScoreScreenActivity + + def get_coop_join_activity(self) -> type[bascenev1.Activity]: + """(internal)""" + from bastd.activity.coopjoin import CoopJoinActivity + + return CoopJoinActivity + + def get_coop_score_screen(self) -> type[bascenev1.Activity]: + """(internal)""" + from bastd.activity.coopscore import CoopScoreScreen + + return CoopScoreScreen + + def get_multi_team_join_activity(self) -> type[bascenev1.Activity]: + """(internal)""" + from bastd.activity.multiteamjoin import MultiTeamJoinActivity + + return MultiTeamJoinActivity + + def get_tutorial_activity(self) -> type[bascenev1.Activity]: + """(internal)""" + from bastd.tutorial import TutorialActivity + + return TutorialActivity + + def tournament_entry_window( + self, + tournament_id: str, + tournament_activity: bascenev1.Activity | None = None, + position: tuple[float, float] = (0.0, 0.0), + delegate: Any = None, + scale: float | None = None, + offset: tuple[float, float] = (0.0, 0.0), + on_close_call: Callable[[], Any] | None = None, + ) -> None: + """(internal)""" + from bastd.ui.tournamententry import TournamentEntryWindow + + TournamentEntryWindow( + tournament_id, + tournament_activity, + position, + delegate, + scale, + offset, + on_close_call, + ) + + def get_main_menu_session(self) -> type[bascenev1.Session]: + """(internal)""" + from bastd.mainmenu import MainMenuSession + + return MainMenuSession + + def continues_window( + self, + activity: bascenev1.Activity, + cost: int, + continue_call: Callable[[], Any], + cancel_call: Callable[[], Any], + ) -> None: + """(internal)""" + from bastd.ui.continues import ContinuesWindow + + ContinuesWindow(activity, cost, continue_call, cancel_call) + + def profile_browser_window( + self, + transition: str = 'in_right', + in_main_menu: bool = True, + selected_profile: str | None = None, + origin_widget: bauiv1.Widget | None = None, + ) -> None: + """(internal)""" + from bastd.ui.profile.browser import ProfileBrowserWindow + + ProfileBrowserWindow( + transition, in_main_menu, selected_profile, origin_widget + ) diff --git a/src/assets/ba_data/python/bascenev1/__init__.py b/src/assets/ba_data/python/bascenev1/__init__.py index 63e212fc..dee16c64 100644 --- a/src/assets/ba_data/python/bascenev1/__init__.py +++ b/src/assets/ba_data/python/bascenev1/__init__.py @@ -147,6 +147,9 @@ from bascenev1._freeforallsession import FreeForAllSession from bascenev1._gameactivity import GameActivity from bascenev1._score import ScoreType, ScoreConfig from bascenev1._dualteamsession import DualTeamSession +from bascenev1._lobby import Lobby, Chooser +from bascenev1._campaign import Campaign +from bascenev1._level import Level from bascenev1._messages import ( UNHANDLED, OutOfBoundsMessage, @@ -385,6 +388,10 @@ __all__ = [ 'AppIntentExec', 'AppMode', 'SceneV1AppMode', + 'Lobby', + 'Chooser', + 'Campaign', + 'Level', ] # Sanity check: we want to keep ballistica's dependencies and diff --git a/src/assets/ba_data/python/bascenev1/_activity.py b/src/assets/ba_data/python/bascenev1/_activity.py index 87cf9560..e7d1140e 100644 --- a/src/assets/ba_data/python/bascenev1/_activity.py +++ b/src/assets/ba_data/python/bascenev1/_activity.py @@ -22,7 +22,6 @@ from bascenev1._player import Player if TYPE_CHECKING: from typing import Any - import baclassic import bascenev1 PlayerT = TypeVar('PlayerT', bound=Player) diff --git a/src/assets/ba_data/python/bascenev1/_activitytypes.py b/src/assets/ba_data/python/bascenev1/_activitytypes.py index 4f290b50..e71ca45c 100644 --- a/src/assets/ba_data/python/bascenev1/_activitytypes.py +++ b/src/assets/ba_data/python/bascenev1/_activitytypes.py @@ -18,7 +18,7 @@ from bascenev1._music import MusicType, setmusic if TYPE_CHECKING: import babase import bascenev1 - from baclassic._lobby import JoinInfo + from bascenev1._lobby import JoinInfo class EndSessionActivity(Activity[EmptyPlayer, EmptyTeam]): @@ -41,14 +41,17 @@ class EndSessionActivity(Activity[EmptyPlayer, EmptyTeam]): def on_begin(self) -> None: # pylint: disable=cyclic-import - from bastd.mainmenu import MainMenuSession + + assert _babase.app.classic is not None from babase._general import Call + main_menu_session = _babase.app.classic.get_main_menu_session() + super().on_begin() _babase.unlock_all_input() assert _babase.app.classic is not None _babase.app.classic.ads.call_after_ad( - Call(_bascenev1.new_host_session, MainMenuSession) + Call(_bascenev1.new_host_session, main_menu_session) ) @@ -110,10 +113,10 @@ class TransitionActivity(Activity[EmptyPlayer, EmptyTeam]): def on_transition_in(self) -> None: # pylint: disable=cyclic-import - from bastd.actor import background # FIXME: Don't use bastd from here. + from bastd.actor.background import Background super().on_transition_in() - self._background = background.Background( + self._background = Background( fade_time=0.5, start_faded=False, show_logo=False ) diff --git a/src/assets/ba_data/python/baclassic/_campaign.py b/src/assets/ba_data/python/bascenev1/_campaign.py similarity index 97% rename from src/assets/ba_data/python/baclassic/_campaign.py rename to src/assets/ba_data/python/bascenev1/_campaign.py index d18d2c24..30d580e5 100644 --- a/src/assets/ba_data/python/baclassic/_campaign.py +++ b/src/assets/ba_data/python/bascenev1/_campaign.py @@ -10,10 +10,10 @@ import _babase if TYPE_CHECKING: from typing import Any import babase - import baclassic + import bascenev1 -def register_campaign(campaign: baclassic.Campaign) -> None: +def register_campaign(campaign: bascenev1.Campaign) -> None: """Register a new campaign.""" assert _babase.app.classic is not None _babase.app.classic.campaigns[campaign.name] = campaign @@ -29,11 +29,11 @@ class Campaign: self, name: str, sequential: bool = True, - levels: list[baclassic.Level] | None = None, + levels: list[bascenev1.Level] | None = None, ): self._name = name self._sequential = sequential - self._levels: list[baclassic.Level] = [] + self._levels: list[bascenev1.Level] = [] if levels is not None: for level in levels: self.addlevel(level) @@ -49,7 +49,7 @@ class Campaign: return self._sequential def addlevel( - self, level: baclassic.Level, index: int | None = None + self, level: bascenev1.Level, index: int | None = None ) -> None: """Adds a baclassic.Level to the Campaign.""" if level.campaign is not None: @@ -61,11 +61,11 @@ class Campaign: self._levels.insert(index, level) @property - def levels(self) -> list[baclassic.Level]: + def levels(self) -> list[bascenev1.Level]: """The list of baclassic.Level-s in the Campaign.""" return self._levels - def getlevel(self, name: str) -> baclassic.Level: + def getlevel(self, name: str) -> bascenev1.Level: """Return a contained baclassic.Level by name.""" from babase import _error @@ -104,7 +104,7 @@ class Campaign: def init_campaigns() -> None: """Fill out initial default Campaigns.""" # pylint: disable=cyclic-import - from baclassic._level import Level + from bascenev1._level import Level from bastd.game.onslaught import OnslaughtGame from bastd.game.football import FootballCoopGame from bastd.game.runaround import RunaroundGame diff --git a/src/assets/ba_data/python/bascenev1/_coopgame.py b/src/assets/ba_data/python/bascenev1/_coopgame.py index bf45e9ae..5dddd624 100644 --- a/src/assets/ba_data/python/bascenev1/_coopgame.py +++ b/src/assets/ba_data/python/bascenev1/_coopgame.py @@ -15,7 +15,6 @@ if TYPE_CHECKING: from typing import Sequence from bastd.actor.playerspaz import PlayerSpaz import babase - import baclassic import bascenev1 PlayerT = TypeVar('PlayerT', bound='bascenev1.Player') diff --git a/src/assets/ba_data/python/bascenev1/_coopsession.py b/src/assets/ba_data/python/bascenev1/_coopsession.py index 265fe4f2..f2ffa5ec 100644 --- a/src/assets/ba_data/python/bascenev1/_coopsession.py +++ b/src/assets/ba_data/python/bascenev1/_coopsession.py @@ -12,7 +12,6 @@ from bascenev1._session import Session if TYPE_CHECKING: from typing import Any, Callable, Sequence import babase - import baclassic import bascenev1 TEAM_COLORS = [(0.2, 0.4, 1.6)] @@ -36,27 +35,29 @@ class CoopSession(Session): # Note: even though these are instance vars, we annotate them at the # class level so that docs generation can access their types. - campaign: baclassic.Campaign | None + campaign: bascenev1.Campaign | None """The baclassic.Campaign instance this Session represents, or None if there is no associated Campaign.""" def __init__(self) -> None: """Instantiate a co-op mode session.""" # pylint: disable=cyclic-import - from bastd.activity.coopjoin import CoopJoinActivity _babase.increment_analytics_count('Co-op session start') app = _babase.app - assert app.classic is not None + classic = app.classic + assert classic is not None + + coop_join_activity = classic.get_coop_join_activity() # If they passed in explicit min/max, honor that. # Otherwise defer to user overrides or defaults. - if 'min_players' in app.classic.coop_session_args: - min_players = app.classic.coop_session_args['min_players'] + if 'min_players' in classic.coop_session_args: + min_players = classic.coop_session_args['min_players'] else: min_players = 1 - if 'max_players' in app.classic.coop_session_args: - max_players = app.classic.coop_session_args['max_players'] + if 'max_players' in classic.coop_session_args: + max_players = classic.coop_session_args['max_players'] else: max_players = app.config.get('Coop Game Max Players', 4) @@ -72,21 +73,21 @@ class CoopSession(Session): ) # Tournament-ID if we correspond to a co-op tournament (otherwise None) - self.tournament_id: str | None = app.classic.coop_session_args.get( + self.tournament_id: str | None = classic.coop_session_args.get( 'tournament_id' ) - self.campaign = app.classic.getcampaign( - app.classic.coop_session_args['campaign'] + self.campaign = classic.getcampaign( + classic.coop_session_args['campaign'] ) - self.campaign_level_name: str = app.classic.coop_session_args['level'] + self.campaign_level_name: str = classic.coop_session_args['level'] self._ran_tutorial_activity = False self._tutorial_activity: bascenev1.Activity | None = None self._custom_menu_ui: list[dict[str, Any]] = [] # Start our joining screen. - self.setactivity(_bascenev1.newactivity(CoopJoinActivity)) + self.setactivity(_bascenev1.newactivity(coop_join_activity)) self._next_game_instance: bascenev1.GameActivity | None = None self._next_game_level_name: str | None = None @@ -112,6 +113,9 @@ class CoopSession(Session): # pylint: disable=cyclic-import from bascenev1._gameactivity import GameActivity + classic = _babase.app.classic + assert classic is not None + # Instantiate levels we may be running soon to let them load in the bg. # Build an instance for the current level. @@ -134,7 +138,7 @@ class CoopSession(Session): levels = self.campaign.levels level = self.campaign.getlevel(self.campaign_level_name) - nextlevel: baclassic.Level | None + nextlevel: bascenev1.Level | None if level.index < len(levels) - 1: nextlevel = levels[level.index + 1] else: @@ -166,9 +170,8 @@ class CoopSession(Session): and self._tutorial_activity is None and not self._ran_tutorial_activity ): - from bastd.tutorial import TutorialActivity - - self._tutorial_activity = _bascenev1.newactivity(TutorialActivity) + tutorial_activity = classic.get_tutorial_activity() + self._tutorial_activity = _bascenev1.newactivity(tutorial_activity) def get_custom_menu_entries(self) -> list[dict[str, Any]]: return self._custom_menu_ui @@ -220,14 +223,14 @@ class CoopSession(Session): self, resume_callback: Callable[[], Any] ) -> None: # pylint: disable=cyclic-import - from bastd.ui.tournamententry import TournamentEntryWindow from bascenev1._gameactivity import GameActivity + assert _babase.app.classic is not None activity = self.getactivity() if activity is not None and not activity.expired: assert self.tournament_id is not None assert isinstance(activity, GameActivity) - TournamentEntryWindow( + _babase.app.classic.tournament_entry_window( tournament_id=self.tournament_id, tournament_activity=activity, on_close_call=resume_callback, @@ -267,8 +270,6 @@ class CoopSession(Session): # pylint: disable=cyclic-import from babase._language import Lstr from babase._general import WeakCall - from bastd.tutorial import TutorialActivity - from bastd.activity.coopscore import CoopScoreScreen from bascenev1._gameresults import GameResults from bascenev1._player import PlayerInfo from bascenev1._activitytypes import JoinActivity, TransitionActivity @@ -276,6 +277,11 @@ class CoopSession(Session): from bascenev1._score import ScoreType app = _babase.app + classic = app.classic + assert classic is not None + + tutorial_activity = classic.get_tutorial_activity() + coop_score_screen = classic.get_coop_score_screen() # If we're running a TeamGameActivity we'll have a GameResults # as results. Otherwise its an old CoopGameActivity so its giving @@ -297,7 +303,7 @@ class CoopSession(Session): # If we're in a between-round activity or a restart-activity, # hop into a round. if isinstance( - activity, (JoinActivity, CoopScoreScreen, TransitionActivity) + activity, (JoinActivity, coop_score_screen, TransitionActivity) ): if outcome == 'next_level': if self._next_game_instance is None: @@ -357,7 +363,7 @@ class CoopSession(Session): # If we were in a tutorial, just pop a transition to get to the # actual round. - elif isinstance(activity, TutorialActivity): + elif isinstance(activity, tutorial_activity): self.setactivity(_bascenev1.newactivity(TransitionActivity)) else: playerinfos: list[bascenev1.PlayerInfo] @@ -424,7 +430,7 @@ class CoopSession(Session): else: self.setactivity( _bascenev1.newactivity( - CoopScoreScreen, + coop_score_screen, { 'playerinfos': playerinfos, 'score': score, diff --git a/src/assets/ba_data/python/bascenev1/_dualteamsession.py b/src/assets/ba_data/python/bascenev1/_dualteamsession.py index 6dea02f5..09a38de6 100644 --- a/src/assets/ba_data/python/bascenev1/_dualteamsession.py +++ b/src/assets/ba_data/python/bascenev1/_dualteamsession.py @@ -34,17 +34,21 @@ class DualTeamSession(MultiTeamSession): def _switch_to_score_screen(self, results: bascenev1.GameResults) -> None: # pylint: disable=cyclic-import - from bastd.activity.drawscore import DrawScoreScreenActivity - from bastd.activity.dualteamscore import TeamVictoryScoreScreenActivity - from bastd.activity.multiteamvictory import ( - TeamSeriesVictoryScoreScreenActivity, - ) + classic = _babase.app.classic + assert classic is not None + draw_score_screen_activity = classic.get_draw_score_screen_activity() + team_victory_score_screen_activity = ( + classic.get_team_series_victory_score_screen_activity() + ) + team_series_victory_score_screen_activity = ( + classic.get_team_series_victory_score_screen_activity() + ) winnergroups = results.winnergroups # If everyone has the same score, call it a draw. if len(winnergroups) < 2: - self.setactivity(_bascenev1.newactivity(DrawScoreScreenActivity)) + self.setactivity(_bascenev1.newactivity(draw_score_screen_activity)) else: winner = winnergroups[0].teams[0] winner.customdata['score'] += 1 @@ -53,12 +57,13 @@ class DualTeamSession(MultiTeamSession): if winner.customdata['score'] >= (self._series_length - 1) / 2 + 1: self.setactivity( _bascenev1.newactivity( - TeamSeriesVictoryScoreScreenActivity, {'winner': winner} + team_series_victory_score_screen_activity, + {'winner': winner}, ) ) else: self.setactivity( _bascenev1.newactivity( - TeamVictoryScoreScreenActivity, {'winner': winner} + team_victory_score_screen_activity, {'winner': winner} ) ) diff --git a/src/assets/ba_data/python/bascenev1/_gameactivity.py b/src/assets/ba_data/python/bascenev1/_gameactivity.py index 7512e9cc..6180e75c 100644 --- a/src/assets/ba_data/python/bascenev1/_gameactivity.py +++ b/src/assets/ba_data/python/bascenev1/_gameactivity.py @@ -27,7 +27,6 @@ if TYPE_CHECKING: from bastd.actor.bomb import TNTSpawner import babase import bascenev1 - import baclassic PlayerT = TypeVar('PlayerT', bound='bascenev1.Player') TeamT = TypeVar('TeamT', bound='bascenev1.Team') @@ -435,9 +434,12 @@ class GameActivity(Activity[PlayerT, TeamT]): """ # pylint: disable=too-many-nested-blocks # pylint: disable=cyclic-import - from bastd.ui.continues import ContinuesWindow from bascenev1._coopsession import CoopSession + classic = _babase.app.classic + assert classic is not None + continues_window = classic.continues_window + plus = _babase.app.plus try: if plus is not None and plus.get_v1_account_misc_read_val( @@ -464,7 +466,7 @@ class GameActivity(Activity[PlayerT, TeamT]): with _babase.ContextRef.empty(): _babase.apptimer( 0.5, - lambda: ContinuesWindow( + lambda: continues_window( self, self._continue_cost, continue_call=WeakCall( diff --git a/src/assets/ba_data/python/bascenev1/_hooks.py b/src/assets/ba_data/python/bascenev1/_hooks.py index 93f1e835..949a31fa 100644 --- a/src/assets/ba_data/python/bascenev1/_hooks.py +++ b/src/assets/ba_data/python/bascenev1/_hooks.py @@ -17,9 +17,9 @@ if TYPE_CHECKING: def launch_main_menu_session() -> None: - from bastd.mainmenu import MainMenuSession + assert _babase.app.classic is not None - _bascenev1.new_host_session(MainMenuSession) + _bascenev1.new_host_session(_babase.app.classic.get_main_menu_session()) def get_player_icon(sessionplayer: bascenev1.SessionPlayer) -> dict[str, Any]: diff --git a/src/assets/ba_data/python/baclassic/_level.py b/src/assets/ba_data/python/bascenev1/_level.py similarity index 91% rename from src/assets/ba_data/python/baclassic/_level.py rename to src/assets/ba_data/python/bascenev1/_level.py index fc12af56..13f7dd9a 100644 --- a/src/assets/ba_data/python/baclassic/_level.py +++ b/src/assets/ba_data/python/bascenev1/_level.py @@ -7,18 +7,14 @@ import copy import weakref from typing import TYPE_CHECKING -import _bauiv1 - if TYPE_CHECKING: from typing import Any - import baclassic import bascenev1 - import bauiv1 class Level: - """An entry in a baclassic.Campaign consisting of a name, game type, and settings. + """An entry in a bascenev1.Campaign. Category: **Gameplay Classes** """ @@ -36,7 +32,7 @@ class Level: self._settings = settings self._preview_texture_name = preview_texture_name self._displayname = displayname - self._campaign: weakref.ref[baclassic.Campaign] | None = None + self._campaign: weakref.ref[bascenev1.Campaign] | None = None self._index: int | None = None self._score_version_string: str | None = None @@ -63,9 +59,9 @@ class Level: """The preview texture name for this Level.""" return self._preview_texture_name - def get_preview_texture(self) -> bauiv1.Texture: - """Load/return the preview Texture for this Level.""" - return _bauiv1.gettexture(self._preview_texture_name) + # def get_preview_texture(self) -> bauiv1.Texture: + # """Load/return the preview Texture for this Level.""" + # return _bauiv1.gettexture(self._preview_texture_name) @property def displayname(self) -> bascenev1.Lstr: @@ -90,7 +86,7 @@ class Level: return self._gametype @property - def campaign(self) -> baclassic.Campaign | None: + def campaign(self) -> bascenev1.Campaign | None: """The baclassic.Campaign this Level is associated with, or None.""" return None if self._campaign is None else self._campaign() @@ -174,7 +170,7 @@ class Level: assert isinstance(val, dict) return val - def set_campaign(self, campaign: baclassic.Campaign, index: int) -> None: + def set_campaign(self, campaign: bascenev1.Campaign, index: int) -> None: """For use by baclassic.Campaign when adding levels to itself. (internal)""" diff --git a/src/assets/ba_data/python/baclassic/_lobby.py b/src/assets/ba_data/python/bascenev1/_lobby.py similarity index 98% rename from src/assets/ba_data/python/baclassic/_lobby.py rename to src/assets/ba_data/python/bascenev1/_lobby.py index fefad3e7..2dd709cc 100644 --- a/src/assets/ba_data/python/baclassic/_lobby.py +++ b/src/assets/ba_data/python/bascenev1/_lobby.py @@ -13,14 +13,13 @@ import _babase from babase._error import print_exception, print_error, NotFoundError from babase._language import Lstr from babase._mgen.enums import SpecialChar, InputType -from bascenev1._gameutils import animate, animate_array import _bascenev1 -from baclassic._profile import get_player_profile_colors +from bascenev1._profile import get_player_profile_colors +from bascenev1._gameutils import animate, animate_array if TYPE_CHECKING: from typing import Any, Sequence - import baclassic import bascenev1 MAX_QUICK_CHANGE_COUNT = 30 @@ -32,7 +31,7 @@ QUICK_CHANGE_RESET_INTERVAL = 1.0 class JoinInfo: """Display useful info for joiners.""" - def __init__(self, lobby: baclassic.Lobby): + def __init__(self, lobby: bascenev1.Lobby): from bascenev1._nodeactor import NodeActor from babase._general import WeakCall @@ -121,8 +120,6 @@ class JoinInfo: self._timer = _bascenev1.Timer(4.0, WeakCall(self._update), repeat=True) def _update_for_keyboard(self, keyboard: bascenev1.InputDevice) -> None: - from baclassic import _input - classic = _babase.app.classic assert classic is not None @@ -164,7 +161,7 @@ class JoinInfo: class PlayerReadyMessage: """Tells an object a player has been selected from the given chooser.""" - chooser: baclassic.Chooser + chooser: bascenev1.Chooser @dataclass @@ -354,7 +351,7 @@ class Chooser: ): app.classic.lobby_random_profile_index += 1 if app.classic.lobby_random_profile_index < len(profilenames): - profileindex = app.classic.lobby_random_profile_index + profileindex: int = app.classic.lobby_random_profile_index app.classic.lobby_random_profile_index += 1 return profileindex assert '_random' in profilenames @@ -384,14 +381,14 @@ class Chooser: return self.lobby.sessionteams[self._selected_team_index] @property - def lobby(self) -> baclassic.Lobby: + def lobby(self) -> bascenev1.Lobby: """The chooser's baclassic.Lobby.""" lobby = self._lobby() if lobby is None: raise NotFoundError('Lobby does not exist.') return lobby - def get_lobby(self) -> baclassic.Lobby | None: + def get_lobby(self) -> bascenev1.Lobby | None: """Return this chooser's lobby if it still exists; otherwise None.""" return self._lobby() @@ -581,15 +578,17 @@ class Chooser: def _set_ready(self, ready: bool) -> None: # pylint: disable=cyclic-import - from bastd.ui.profile import browser as pbrowser from babase._general import Call + classic = _babase.app.classic + assert classic is not None + profilename = self._profilenames[self._profileindex] # Handle '_edit' as a special case. if profilename == '_edit' and ready: with _babase.ContextRef.empty(): - pbrowser.ProfileBrowserWindow(in_main_menu=False) + classic.profile_browser_window(in_main_menu=False) # Give their input-device UI ownership too # (prevent someone else from snatching it in crowded games) diff --git a/src/assets/ba_data/python/bascenev1/_map.py b/src/assets/ba_data/python/bascenev1/_map.py index bd8d75c1..4a13dc49 100644 --- a/src/assets/ba_data/python/bascenev1/_map.py +++ b/src/assets/ba_data/python/bascenev1/_map.py @@ -15,7 +15,6 @@ if TYPE_CHECKING: from typing import Sequence, Any import babase - import baclassic import bascenev1 @@ -66,7 +65,8 @@ def get_map_class(name: str) -> type[Map]: assert _babase.app.classic is not None name = get_filtered_map_name(name) try: - return _babase.app.classic.maps[name] + mapclass: type[Map] = _babase.app.classic.maps[name] + return mapclass except KeyError: from babase import _error diff --git a/src/assets/ba_data/python/bascenev1/_multiteamsession.py b/src/assets/ba_data/python/bascenev1/_multiteamsession.py index b27bad93..2899c43d 100644 --- a/src/assets/ba_data/python/bascenev1/_multiteamsession.py +++ b/src/assets/ba_data/python/bascenev1/_multiteamsession.py @@ -41,12 +41,14 @@ class MultiTeamSession(Session): """Set up playlists & launch a bascenev1.Activity to accept joiners.""" # pylint: disable=cyclic-import from bascenev1 import _playlist - from bastd.activity.multiteamjoin import MultiTeamJoinActivity app = _babase.app - assert app.classic is not None + classic = app.classic + assert classic is not None cfg = app.config + multi_team_join_activity = classic.get_multi_team_join_activity() + if self.use_teams: team_names = cfg.get('Custom Team Names', DEFAULT_TEAM_NAMES) team_colors = cfg.get('Custom Team Colors', DEFAULT_TEAM_COLORS) @@ -65,18 +67,18 @@ class MultiTeamSession(Session): max_players=self.get_max_players(), ) - self._series_length = app.classic.teams_series_length - self._ffa_series_length = app.classic.ffa_series_length + self._series_length: int = classic.teams_series_length + self._ffa_series_length: int = classic.ffa_series_length show_tutorial = cfg.get('Show Tutorial', True) self._tutorial_activity_instance: bascenev1.Activity | None if show_tutorial: - from bastd.tutorial import TutorialActivity + tutorial_activity = classic.get_tutorial_activity() # Get this loading. self._tutorial_activity_instance = _bascenev1.newactivity( - TutorialActivity + tutorial_activity ) else: self._tutorial_activity_instance = None @@ -131,7 +133,7 @@ class MultiTeamSession(Session): self._instantiate_next_game() # Start in our custom join screen. - self.setactivity(_bascenev1.newactivity(MultiTeamJoinActivity)) + self.setactivity(_bascenev1.newactivity(multi_team_join_activity)) def get_ffa_series_length(self) -> int: """Return free-for-all series length.""" @@ -173,16 +175,19 @@ class MultiTeamSession(Session): self, activity: bascenev1.Activity, results: Any ) -> None: # pylint: disable=cyclic-import - from bastd.tutorial import TutorialActivity - from bastd.activity.multiteamvictory import ( - TeamSeriesVictoryScoreScreenActivity, - ) from bascenev1._activitytypes import ( TransitionActivity, JoinActivity, ScoreScreenActivity, ) + classic = _babase.app.classic + assert classic is not None + tutorial_activity = classic.get_tutorial_activity() + team_series_victory_score_screen_activity = ( + classic.get_team_series_victory_score_screen_activity() + ) + # If we have a tutorial to show, that's the first thing we do no # matter what. if self._tutorial_activity_instance is not None: @@ -192,7 +197,7 @@ class MultiTeamSession(Session): # If we're leaving the tutorial activity, pop a transition activity # to transition us into a round gracefully (otherwise we'd snap from # one terrain to another instantly). - elif isinstance(activity, TutorialActivity): + elif isinstance(activity, tutorial_activity): self.setactivity(_bascenev1.newactivity(TransitionActivity)) # If we're in a between-round activity or a restart-activity, hop @@ -201,7 +206,7 @@ class MultiTeamSession(Session): activity, (JoinActivity, TransitionActivity, ScoreScreenActivity) ): # If we're coming from a series-end activity, reset scores. - if isinstance(activity, TeamSeriesVictoryScoreScreenActivity): + if isinstance(activity, team_series_victory_score_screen_activity): self.stats.reset() self._game_number = 0 for team in self.sessionteams: diff --git a/src/assets/ba_data/python/baclassic/_profile.py b/src/assets/ba_data/python/bascenev1/_profile.py similarity index 100% rename from src/assets/ba_data/python/baclassic/_profile.py rename to src/assets/ba_data/python/bascenev1/_profile.py diff --git a/src/assets/ba_data/python/bascenev1/_session.py b/src/assets/ba_data/python/bascenev1/_session.py index 652ddace..6276542c 100644 --- a/src/assets/ba_data/python/bascenev1/_session.py +++ b/src/assets/ba_data/python/bascenev1/_session.py @@ -16,7 +16,6 @@ if TYPE_CHECKING: from typing import Sequence, Any import babase - import baclassic import bascenev1 @@ -47,7 +46,7 @@ class Session: # at the class level so that looks better and nobody get lost while # reading large __init__ - lobby: baclassic.Lobby + lobby: bascenev1.Lobby """The baclassic.Lobby instance where new bascenev1.Player-s go to select a Profile/Team/etc. before being added to games. Be aware this value may be None if a Session does not allow @@ -93,12 +92,12 @@ class Session: # pylint: disable=cyclic-import # pylint: disable=too-many-branches from efro.util import empty_weakref - from baclassic._lobby import Lobby from bascenev1._dependency import ( Dependency, AssetPackage, DependencyError, ) + from bascenev1._lobby import Lobby from bascenev1._stats import Stats from bascenev1._gameactivity import GameActivity from bascenev1._activity import Activity @@ -409,7 +408,6 @@ class Session: will replace the old. """ from babase._general import Call - from babase._mgen.enums import TimeType # Only pay attention if this is coming from our current activity. if activity is not self._activity_retained: @@ -436,7 +434,7 @@ class Session: def handlemessage(self, msg: Any) -> Any: """General message handling; can be passed any message object.""" - from baclassic._lobby import PlayerReadyMessage + from bascenev1._lobby import PlayerReadyMessage from bascenev1._messages import PlayerProfilesChangedMessage, UNHANDLED if isinstance(msg, PlayerReadyMessage): @@ -629,7 +627,7 @@ class Session: self._activity_should_end_immediately_delay, ) - def _on_player_ready(self, chooser: baclassic.Chooser) -> None: + def _on_player_ready(self, chooser: bascenev1.Chooser) -> None: """Called when a bascenev1.Player has checked themself ready.""" lobby = chooser.lobby activity = self._activity_weak() @@ -691,7 +689,7 @@ class Session: _babase.pushcall(self.begin_next_activity) def _add_chosen_player( - self, chooser: baclassic.Chooser + self, chooser: bascenev1.Chooser ) -> bascenev1.SessionPlayer: from bascenev1._team import SessionTeam diff --git a/src/assets/ba_data/python/bastd/activity/coopscore.py b/src/assets/ba_data/python/bastd/activity/coopscore.py index 7bcf89a4..56528e1a 100644 --- a/src/assets/ba_data/python/bastd/activity/coopscore.py +++ b/src/assets/ba_data/python/bastd/activity/coopscore.py @@ -50,7 +50,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): self._menu_icon_texture = bui.gettexture('menuIcon') self._next_level_icon_texture = bui.gettexture('nextLevelIcon') - self._campaign: baclassic.Campaign = settings['campaign'] + self._campaign: bs.Campaign = settings['campaign'] self._have_achievements = ( bs.app.classic is not None diff --git a/src/assets/ba_data/python/bastd/ui/coop/gamebutton.py b/src/assets/ba_data/python/bastd/ui/coop/gamebutton.py index ea22a7ba..2bd3a86c 100644 --- a/src/assets/ba_data/python/bastd/ui/coop/gamebutton.py +++ b/src/assets/ba_data/python/bastd/ui/coop/gamebutton.py @@ -87,7 +87,9 @@ class GameButton: size=(image_width, image_width * 0.5), mesh_transparent=window.lsbt, mesh_opaque=window.lsbo, - texture=campaign.getlevel(levelname).get_preview_texture(), + texture=bui.gettexture( + campaign.getlevel(levelname).preview_texture_name + ), mask_texture=bui.gettexture('mapPreviewMask'), ) diff --git a/src/assets/ba_data/python/bastd/ui/coop/tournamentbutton.py b/src/assets/ba_data/python/bastd/ui/coop/tournamentbutton.py index 66a6e777..4c71488d 100644 --- a/src/assets/ba_data/python/bastd/ui/coop/tournamentbutton.py +++ b/src/assets/ba_data/python/bastd/ui/coop/tournamentbutton.py @@ -584,7 +584,9 @@ class TournamentButton: bui.textwidget(edit=self.button_text, text=txt) bui.imagewidget( edit=self.image, - texture=campaign.getlevel(levelname).get_preview_texture(), + texture=bui.gettexture( + campaign.getlevel(levelname).preview_texture_name + ), opacity=1.0 if enabled else 0.5, )