diff --git a/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py b/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py index 5315b1a9..4373d66c 100644 --- a/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py +++ b/src/assets/ba_data/python/bascenev1lib/activity/coopscore.py @@ -396,7 +396,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): bui.buttonwidget( parent=rootc, color=(0.45, 0.4, 0.5), - position=(160, v_offs + 480), + position=(160, v_offs + 439), size=(350, 62), label=( bui.Lstr(resource='tournamentStandingsText') @@ -489,8 +489,8 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): x_offs_extra = 0 if show_next_button else -100 self._corner_button_offs = ( - h_offs + 300.0 + 100.0 + x_offs_extra, - v_offs + 560.0, + h_offs + 300.0 + x_offs_extra, + v_offs + 519.0, ) if env.demo or env.arcade: @@ -499,7 +499,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): else: self._league_rank_button = LeagueRankButton( parent=rootc, - position=(h_offs + 300 + 100 + x_offs_extra, v_offs + 560), + position=(h_offs + 300 + x_offs_extra, v_offs + 519), size=(100, 60), scale=0.9, color=(0.4, 0.4, 0.9), @@ -509,7 +509,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ) self._store_button_instance = StoreButton( parent=rootc, - position=(h_offs + 400 + 100 + x_offs_extra, v_offs + 560), + position=(h_offs + 400 + x_offs_extra, v_offs + 519), show_tickets=True, sale_scale=0.85, size=(100, 60), @@ -536,9 +536,8 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ) def _update_corner_button_positions(self) -> None: - offs = -55 assert self._corner_button_offs is not None - pos_x = self._corner_button_offs[0] + offs + pos_x = self._corner_button_offs[0] pos_y = self._corner_button_offs[1] if self._league_rank_button is not None: self._league_rank_button.set_position((pos_x, pos_y)) @@ -716,7 +715,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): color=(0.5, 1, 0.5, 1), h_align='center', scale=0.4, - position=(0, 292), + position=(0, 255), jitter=1.0, ).autoretain() Text( @@ -1277,7 +1276,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ), position=( ts_h_offs - 35 + 95, - ts_height / 2 + 6 + v_offs, + ts_height / 2 + 6 + v_offs - 41, ), color=(0.4, 0.4, 0.4, 1.0), scale=0.7, @@ -1344,7 +1343,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): ts_height / 2 + -ts_height * (i + 1) / 10 + v_offs - + 11.0, + - 30.0, ), h_align=Text.HAlign.RIGHT, v_align=Text.VAlign.CENTER, @@ -1361,7 +1360,7 @@ class CoopScoreScreen(bs.Activity[bs.Player, bs.Team]): + -ts_height * (i + 1) / 10 + v_offs_names + v_offs - + 11.0, + - 30.0, ), maxwidth=80.0 + 100.0 * len(self._playerinfos), v_align=Text.VAlign.CENTER, diff --git a/src/assets/ba_data/python/bascenev1lib/mainmenu.py b/src/assets/ba_data/python/bascenev1lib/mainmenu.py index 15d5e24f..78d13d7e 100644 --- a/src/assets/ba_data/python/bascenev1lib/mainmenu.py +++ b/src/assets/ba_data/python/bascenev1lib/mainmenu.py @@ -7,6 +7,7 @@ from __future__ import annotations import time import random import weakref +import functools from typing import TYPE_CHECKING, override import bascenev1 as bs @@ -42,6 +43,7 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): self._update_timer: bs.Timer | None = None self._news: NewsDisplay | None = None self._attract_mode_timer: bs.Timer | None = None + self._logo_rotate_timer: bs.Timer | None = None @override def on_transition_in(self) -> None: @@ -566,7 +568,6 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): vr_depth_offset: float = 0.0, ) -> None: # pylint: disable=too-many-locals - # Temp easter goodness. if custom_texture is None: custom_texture = self._get_custom_logo_tex_name() @@ -584,6 +585,7 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): bs.newnode( 'image', attrs={ + 'position': (x, y), 'texture': ltex, 'mesh_opaque': mopaque, 'mesh_transparent': mtrans, @@ -592,47 +594,68 @@ class MainMenuActivity(bs.Activity[bs.Player, bs.Team]): 'attach': 'center', 'tilt_translate': 0.21, 'absolute_scale': True, + 'scale': ( + (2000.0,2000.0) if custom_texture is None + else None + ) }, ) ) self._logo_node = logo.node self._word_actors.append(logo) - # Add a bit of stop-motion-y jitter to the logo (unless we're in - # VR mode in which case its best to leave things still). + # Add a bit of stop-motion-y jitter to the logo + # (unless we're in VR mode in which case its best to + # leave things still). assert logo.node - if not bs.app.env.vr: - cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) - cmb.connectattr('output', logo.node, 'position') - keys = {} - time_v = 0.0 + def jitter() -> None: + if not bs.app.env.vr: + cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) + cmb.connectattr('output', logo.node, 'position') + keys = {} + time_v = 0.0 - # Gen some random keys for that stop-motion-y look - for _i in range(10): - keys[time_v] = x + (random.random() - 0.5) * 0.7 * jitter_scale - time_v += random.random() * 0.1 - bs.animate(cmb, 'input0', keys, loop=True) - keys = {} - time_v = 0.0 - for _i in range(10): - keys[time_v * self._ts] = ( - y + (random.random() - 0.5) * 0.7 * jitter_scale + # Gen some random keys for that stop-motion-y look + for _i in range(10): + keys[time_v] = ( + x + (random.random() - 0.5) * 0.7 * jitter_scale + ) + time_v += random.random() * 0.1 + bs.animate(cmb, 'input0', keys, loop=True) + keys = {} + time_v = 0.0 + for _i in range(10): + keys[time_v * self._ts] = ( + y + (random.random() - 0.5) * 0.7 * jitter_scale + ) + time_v += random.random() * 0.1 + bs.animate(cmb, 'input1', keys, loop=True) + + if custom_texture is None: + def rotate_logo() -> None: + logo_scale = logo.node.scale + logo.node.rotate = logo.node.rotate + 4 + logo.node.scale = ( + logo_scale[0] - 20, logo_scale[1] - 20 ) - time_v += random.random() * 0.1 - bs.animate(cmb, 'input1', keys, loop=True) + if logo.node.rotate >= 356: + self._logo_rotate_timer = None + jitter() + self._logo_rotate_timer = bs.Timer( + 0.001, functools.partial(rotate_logo), repeat = True + ) else: - logo.node.position = (x, y) + jitter() + cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) - cmb = bs.newnode('combine', owner=logo.node, attrs={'size': 2}) - - keys = { - delay: 0.0, - delay + 0.1: 700.0 * scale, - delay + 0.2: 600.0 * scale, - } - bs.animate(cmb, 'input0', keys) - bs.animate(cmb, 'input1', keys) - cmb.connectattr('output', logo.node, 'scale') + keys = { + delay: 0.0, + delay + 0.1: 700.0 * scale, + delay + 0.2: 600.0 * scale, + } + bs.animate(cmb, 'input0', keys) + bs.animate(cmb, 'input1', keys) + cmb.connectattr('output', logo.node, 'scale') def _start_preloads(self) -> None: # FIXME: The func that calls us back doesn't save/restore state diff --git a/src/assets/ba_data/python/bauiv1lib/ingamemenu.py b/src/assets/ba_data/python/bauiv1lib/ingamemenu.py index f72477f9..96b23840 100644 --- a/src/assets/ba_data/python/bauiv1lib/ingamemenu.py +++ b/src/assets/ba_data/python/bauiv1lib/ingamemenu.py @@ -592,3 +592,6 @@ class InGameMenuWindow(bui.MainWindow): logging.exception('Error in classic resume callback.') classic.main_menu_resume_callbacks.clear() + + def __del__(self) -> None: + self._resume() diff --git a/src/assets/ba_data/python/bauiv1lib/settings/advanced.py b/src/assets/ba_data/python/bauiv1lib/settings/advanced.py index 475d687e..d3915c32 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/advanced.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/advanced.py @@ -132,7 +132,7 @@ class AdvancedSettingsWindow(bui.MainWindow): self._height - (57 if uiscale is bui.UIScale.SMALL else 40), ), size=(0, 0), - scale=0.5 if uiscale is bui.UIScale.SMALL else 1.0, + scale=0.65 if uiscale is bui.UIScale.SMALL else 1.0, text=bui.Lstr(resource=f'{self._r}.titleText'), color=app.ui_v1.title_color, h_align='center', diff --git a/src/assets/ba_data/python/bauiv1lib/settings/controls.py b/src/assets/ba_data/python/bauiv1lib/settings/controls.py index 41ebb598..591d0b81 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/controls.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/controls.py @@ -148,7 +148,9 @@ class ControlsSettingsWindow(bui.MainWindow): bui.textwidget( parent=self._root_widget, - position=(0, height - 49 + yoffs), + position=(0, height + yoffs - ( + 75 if uiscale is bui.UIScale.SMALL else 50) + ), size=(width, 25), text=bui.Lstr(resource=f'{self._r}.titleText'), color=bui.app.ui_v1.title_color, @@ -296,7 +298,8 @@ class ControlsSettingsWindow(bui.MainWindow): xinput_checkbox = bui.checkboxwidget( parent=self._root_widget, - position=(100, v + 3), + position=(width * ( + 0.35 if uiscale is bui.UIScale.SMALL else 0.25), v + 3), size=(120, 30), value=(not bui.get_low_level_config_value('enablexinput', 1)), maxwidth=200, diff --git a/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc b/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc index bcaa0a5e..5e87695e 100644 --- a/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc +++ b/src/ballistica/ui_v1/python/methods/python_methods_ui_v1.cc @@ -2499,6 +2499,7 @@ static auto PySetPartyWindowOpen(PyObject* self, PyObject* args, // } // root_ui->set_party_window_open(static_cast(value)); + g_ui_v1->set_party_window_open(static_cast(value)); Py_RETURN_NONE; BA_PYTHON_CATCH; } diff --git a/src/ballistica/ui_v1/ui_v1.cc b/src/ballistica/ui_v1/ui_v1.cc index 7410ab70..b0709536 100644 --- a/src/ballistica/ui_v1/ui_v1.cc +++ b/src/ballistica/ui_v1/ui_v1.cc @@ -102,7 +102,7 @@ bool UIV1FeatureSet::PartyWindowOpen() { // if (auto* r = root_ui()) { // return r->party_window_open(); // } - return false; + return party_window_open_; } void UIV1FeatureSet::Draw(base::FrameDef* frame_def) { diff --git a/src/ballistica/ui_v1/ui_v1.h b/src/ballistica/ui_v1/ui_v1.h index 8242557b..f9824c9b 100644 --- a/src/ballistica/ui_v1/ui_v1.h +++ b/src/ballistica/ui_v1/ui_v1.h @@ -125,6 +125,9 @@ class UIV1FeatureSet : public FeatureSetNativeComponent, auto always_use_internal_on_screen_keyboard() const { return always_use_internal_on_screen_keyboard_; } + auto set_party_window_open(bool value) { + party_window_open_ = value; + } auto HasQuitConfirmDialog() -> bool override; void ConfirmQuit(QuitType quit_type) override; @@ -135,6 +138,7 @@ class UIV1FeatureSet : public FeatureSetNativeComponent, Object::Ref overlay_root_widget_; Object::Ref root_widget_; bool always_use_internal_on_screen_keyboard_{}; + bool party_window_open_{false}; int ui_lock_count_{}; int language_state_{}; };