From a38745e4276c619c4301a9cdbf1a9243b97b32be Mon Sep 17 00:00:00 2001 From: SoK05 Date: Mon, 8 Jan 2024 04:57:05 +0100 Subject: [PATCH 01/27] Runaround - Heartbeat mechanic --- .../python/bascenev1lib/game/runaround.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/assets/ba_data/python/bascenev1lib/game/runaround.py b/src/assets/ba_data/python/bascenev1lib/game/runaround.py index 6640601f..ee456505 100644 --- a/src/assets/ba_data/python/bascenev1lib/game/runaround.py +++ b/src/assets/ba_data/python/bascenev1lib/game/runaround.py @@ -521,6 +521,18 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): if self._lives == 0: self._bots.stop_moving() self.continue_or_end_game() + + # Heartbeat behavior + if self._lives < 5: + hbtime = 0.39 + (0.21 * self._lives) + self._lives_hbtime = bs.Timer(hbtime, + lambda: self.heart_dyin(True, hbtime), + repeat=True) + self.heart_dyin(True) + else: + self._lives_hbtime = None + self.heart_dyin(False) + assert self._lives_text is not None assert self._lives_text.node self._lives_text.node.text = str(self._lives) @@ -1358,3 +1370,31 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): def _set_can_end_wave(self) -> None: self._can_end_wave = True + + def heart_dyin(self, + status: bool, + time: float = 1.22) -> None: + """ Makes the UI heart beat at low health. """ + if not (self._lives_bg or + self._lives_bg.node.exists()): return + + heart = self._lives_bg.node + + # Make the heart beat intensely! + if status: + bs.animate_array(heart, 'scale', 2, { + 0:(90,90), + time*0.1:(105,105), + time*0.21:(88,88), + time*0.42:(90,90), + time*0.52:(105,105), + time*0.63:(88,88), + time:(90,90), + }) + + # Neutralize heartbeat (Done did when dead.) + else: + bs.animate_array(heart, 'scale', 2, { + 0:heart.scale, + time:(90,90), + }) From 72294c2b0be81981c9008d434ce33a300ae289b8 Mon Sep 17 00:00:00 2001 From: SoK05 Date: Mon, 8 Jan 2024 05:02:14 +0100 Subject: [PATCH 02/27] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8fccc544..0f488043 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -50,3 +50,11 @@ ### Rikko - Created the original "reject_recently_left_players" plugin + +### SoK +- Modder +- BSE Heartbeat mechanic port + +### Temp +- Modder +- CTF Flag Bug Fix \ No newline at end of file From 3cf2058447bd9937203c292c5593d05c6e2ba4d4 Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Wed, 10 Jan 2024 20:16:29 -0600 Subject: [PATCH 03/27] contibor --- CONTRIBUTORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8fccc544..626648a1 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -50,3 +50,6 @@ ### Rikko - Created the original "reject_recently_left_players" plugin + +### Temp (3alTemp) +- Modder & Bug Fixer \ No newline at end of file From d0c7b4497b7117ec4f560fe5818d91bf5fe17b40 Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Wed, 10 Jan 2024 21:31:00 -0600 Subject: [PATCH 04/27] Respawn dots --- .../python/bascenev1lib/actor/respawnicon.py | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 72a14c93..f56f1c76 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -92,7 +92,7 @@ class RespawnIcon: assert self._name.node bs.animate(self._name.node, 'scale', {0: 0, 0.1: 0.5}) - tpos = (-60 - h_offs if on_right else 60 + h_offs, -192 + offs) + tpos = (-60 - h_offs if on_right else 60 + h_offs, -193 + offs) self._text: bs.NodeActor | None = bs.NodeActor( bs.newnode( 'text', @@ -109,9 +109,27 @@ class RespawnIcon: }, ) ) + dpos = [ipos[0] + (7 if on_right else -7), ipos[1] - 16] + self._dec_text: bs.NodeActor | None = bs.NodeActor( + bs.newnode( + 'text', + attrs={ + 'position': dpos, + 'h_attach': 'right' if on_right else 'left', + 'h_align': 'right' if on_right else 'left', + 'scale': 0.65, + 'shadow': 0.5, + 'flatness': 0.5, + 'v_attach': 'top', + 'color': bs.safecolor(icon['tint_color']), + 'text': '...', + }, + ) + ) assert self._text.node bs.animate(self._text.node, 'scale', {0: 0, 0.1: 0.9}) + bs.animate(self._dec_text.node, 'scale', {0: 0, 0.1: 0.65}) self._respawn_time = bs.time() + respawn_time self._update() @@ -155,10 +173,20 @@ class RespawnIcon: def _update(self) -> None: remaining = int(round(self._respawn_time - bs.time())) + + def dec_step(): + self._dec_text.node.text = self._dec_text.node.text[:-1] + if remaining > 0: assert self._text is not None if self._text.node: self._text.node.text = str(remaining) + self._dec_text.node.text = '...' + bs.timer(0.25, dec_step) + bs.timer(0.5, dec_step) + bs.timer(0.75, dec_step) else: self._visible = False - self._image = self._text = self._timer = self._name = None + self._image = ( + self._text + ) = self._dec_text = self._timer = self._name = None From 1043a38d9dcad8ee4e01400a6721990349c05dfb Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Thu, 11 Jan 2024 19:36:46 -0600 Subject: [PATCH 05/27] setting shenanigans --- .../python/bascenev1lib/actor/respawnicon.py | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index f56f1c76..08e8ddd5 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -23,6 +23,7 @@ class RespawnIcon: def __init__(self, player: bs.Player, respawn_time: float): """Instantiate with a Player and respawn_time (in seconds).""" self._visible = True + self._dots_epic_only = False on_right, offs_extra, respawn_icons = self._get_context(player) @@ -110,26 +111,33 @@ class RespawnIcon: ) ) dpos = [ipos[0] + (7 if on_right else -7), ipos[1] - 16] - self._dec_text: bs.NodeActor | None = bs.NodeActor( - bs.newnode( - 'text', - attrs={ - 'position': dpos, - 'h_attach': 'right' if on_right else 'left', - 'h_align': 'right' if on_right else 'left', - 'scale': 0.65, - 'shadow': 0.5, - 'flatness': 0.5, - 'v_attach': 'top', - 'color': bs.safecolor(icon['tint_color']), - 'text': '...', - }, + self._dec_text: bs.NodeActor | None = None + if ( + self._dots_epic_only + and bs.getactivity().globalsnode.slow_motion + or not self._dots_epic_only + ): + self._dec_text = bs.NodeActor( + bs.newnode( + 'text', + attrs={ + 'position': dpos, + 'h_attach': 'right' if on_right else 'left', + 'h_align': 'right' if on_right else 'left', + 'scale': 0.65, + 'shadow': 0.5, + 'flatness': 0.5, + 'v_attach': 'top', + 'color': bs.safecolor(icon['tint_color']), + 'text': '', + }, + ) ) - ) assert self._text.node bs.animate(self._text.node, 'scale', {0: 0, 0.1: 0.9}) - bs.animate(self._dec_text.node, 'scale', {0: 0, 0.1: 0.65}) + if self._dec_text: + bs.animate(self._dec_text.node, 'scale', {0: 0, 0.1: 0.65}) self._respawn_time = bs.time() + respawn_time self._update() @@ -146,7 +154,7 @@ class RespawnIcon: """Return info on where we should be shown and stored.""" activity = bs.getactivity() - if isinstance(bs.getsession(), bs.DualTeamSession): + if isinstance(activity.session, bs.DualTeamSession): on_right = player.team.id % 2 == 1 # Store a list of icons in the team. @@ -181,10 +189,11 @@ class RespawnIcon: assert self._text is not None if self._text.node: self._text.node.text = str(remaining) - self._dec_text.node.text = '...' - bs.timer(0.25, dec_step) - bs.timer(0.5, dec_step) - bs.timer(0.75, dec_step) + if self._dec_text: + self._dec_text.node.text = '...' + bs.timer(0.25, dec_step) + bs.timer(0.5, dec_step) + bs.timer(0.75, dec_step) else: self._visible = False self._image = ( From 4fba33985126ec7151bf4223f2c9f54e9ddbcc2b Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Thu, 11 Jan 2024 19:42:13 -0600 Subject: [PATCH 06/27] changed some logs --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1480580..457955da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ - Players now get points for killing bots with their own bombs by catching it and throwing it back at them. This is actually old logic but was disabled due to a logic flaw, but should be fixed now. (Thanks VinniTR!) +- Respawn icons now have dotted steps showing decimal progress to assist + players on calculating when they are gonna respawn. (Thanks Temp!) ### 1.7.32 (build 21741, api 8, 2023-12-20) - Fixed a screen message that no one will ever see (Thanks vishal332008?...) From 55637881c0cdfa6e6011470a47c13bef0d61ed79 Mon Sep 17 00:00:00 2001 From: VinniTR <71152012+VinniTR@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:22:50 -0500 Subject: [PATCH 07/27] Update spazbot.py --- src/assets/ba_data/python/bascenev1lib/actor/spazbot.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py b/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py index 75d0eeb3..c061207c 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py @@ -600,7 +600,6 @@ class BomberBotLite(BomberBot): punchiness = 0.2 throw_rate = 0.7 throwiness = 0.1 - charge_speed_min = 0.6 charge_speed_max = 0.6 @@ -772,7 +771,6 @@ class ChargerBotPro(ChargerBot): color = PRO_BOT_COLOR highlight = PRO_BOT_HIGHLIGHT - default_shields = True default_boxing_gloves = True points_mult = 3 From d6cce8e3fb84cf40f2f1109031715b8f7a006832 Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Thu, 25 Jan 2024 16:07:49 -0600 Subject: [PATCH 08/27] pylinted --- .../ba_data/python/bascenev1lib/actor/respawnicon.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 08e8ddd5..01ac91ca 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -19,11 +19,12 @@ class RespawnIcon: _MASKTEXSTORENAME = bs.storagename('masktex') _ICONSSTORENAME = bs.storagename('icons') + + steps_epic_only: bool = False def __init__(self, player: bs.Player, respawn_time: float): """Instantiate with a Player and respawn_time (in seconds).""" self._visible = True - self._dots_epic_only = False on_right, offs_extra, respawn_icons = self._get_context(player) @@ -113,9 +114,9 @@ class RespawnIcon: dpos = [ipos[0] + (7 if on_right else -7), ipos[1] - 16] self._dec_text: bs.NodeActor | None = None if ( - self._dots_epic_only + self.steps_epic_only and bs.getactivity().globalsnode.slow_motion - or not self._dots_epic_only + or not self.steps_epic_only ): self._dec_text = bs.NodeActor( bs.newnode( From 819edc18eb71d6995da65e01a8a52f3403537a2d Mon Sep 17 00:00:00 2001 From: SoK05 Date: Thu, 25 Jan 2024 23:18:11 +0100 Subject: [PATCH 09/27] pylint fix --- src/assets/ba_data/python/bascenev1lib/game/runaround.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/ba_data/python/bascenev1lib/game/runaround.py b/src/assets/ba_data/python/bascenev1lib/game/runaround.py index ee456505..245ada60 100644 --- a/src/assets/ba_data/python/bascenev1lib/game/runaround.py +++ b/src/assets/ba_data/python/bascenev1lib/game/runaround.py @@ -188,6 +188,7 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): self._lives_text: bs.NodeActor | None = None self._flawless = True self._time_bonus_timer: bs.Timer | None = None + self._lives_hbtime: bs.Timer | None = None self._time_bonus_text: bs.NodeActor | None = None self._time_bonus_mult: float | None = None self._wave_text: bs.NodeActor | None = None From 020aa8829a62702453cfdfbf34c14e2d23f0ccad Mon Sep 17 00:00:00 2001 From: 3alTemp Date: Fri, 1 Mar 2024 21:34:38 -0600 Subject: [PATCH 10/27] CI fix I think... --- .../python/bascenev1lib/actor/respawnicon.py | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 01ac91ca..21ed1afd 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -19,12 +19,12 @@ class RespawnIcon: _MASKTEXSTORENAME = bs.storagename('masktex') _ICONSSTORENAME = bs.storagename('icons') - - steps_epic_only: bool = False def __init__(self, player: bs.Player, respawn_time: float): """Instantiate with a Player and respawn_time (in seconds).""" + # pylint: disable=too-many-locals self._visible = True + self._dots_epic_only = False on_right, offs_extra, respawn_icons = self._get_context(player) @@ -114,9 +114,9 @@ class RespawnIcon: dpos = [ipos[0] + (7 if on_right else -7), ipos[1] - 16] self._dec_text: bs.NodeActor | None = None if ( - self.steps_epic_only + self._dots_epic_only and bs.getactivity().globalsnode.slow_motion - or not self.steps_epic_only + or not self._dots_epic_only ): self._dec_text = bs.NodeActor( bs.newnode( @@ -141,6 +141,7 @@ class RespawnIcon: bs.animate(self._dec_text.node, 'scale', {0: 0, 0.1: 0.65}) self._respawn_time = bs.time() + respawn_time + self._dec_timer: bs.Timer | None = None self._update() self._timer: bs.Timer | None = bs.Timer( 1.0, bs.WeakCall(self._update), repeat=True @@ -180,21 +181,25 @@ class RespawnIcon: offs_extra = -20 return on_right, offs_extra, icons + def _dec_step(self): + self._dec_text.node.text = self._dec_text.node.text[:-1] + # Kill our timer if the string is nothing. + if self._dec_text.node.text == '': + self._dec_timer = None + def _update(self) -> None: remaining = int(round(self._respawn_time - bs.time())) - def dec_step(): - self._dec_text.node.text = self._dec_text.node.text[:-1] - if remaining > 0: assert self._text is not None if self._text.node: self._text.node.text = str(remaining) if self._dec_text: self._dec_text.node.text = '...' - bs.timer(0.25, dec_step) - bs.timer(0.5, dec_step) - bs.timer(0.75, dec_step) + # Start our decimals timer + self._dec_timer = bs.Timer( + 0.25, bs.WeakCall(self._dec_step), repeat=True + ) else: self._visible = False self._image = ( From 3c4aaa7fc402d43d1cfff448ffbdd9fcca89e9e0 Mon Sep 17 00:00:00 2001 From: 3alTemp Date: Fri, 1 Mar 2024 21:42:47 -0600 Subject: [PATCH 11/27] https://media1.tenor.com/m/FcVrboOogkQAAAAC/my-bad --- src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 21ed1afd..6bf722af 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -181,7 +181,7 @@ class RespawnIcon: offs_extra = -20 return on_right, offs_extra, icons - def _dec_step(self): + def _dec_step(self) -> None: self._dec_text.node.text = self._dec_text.node.text[:-1] # Kill our timer if the string is nothing. if self._dec_text.node.text == '': From 51445134feaf453e02a9df6f972480ddef059aae Mon Sep 17 00:00:00 2001 From: VinniTR <71152012+VinniTR@users.noreply.github.com> Date: Fri, 1 Mar 2024 22:58:44 -0500 Subject: [PATCH 12/27] remove first change --- src/assets/ba_data/python/bascenev1lib/actor/spazbot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py b/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py index c061207c..a9d7b46d 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/spazbot.py @@ -600,6 +600,7 @@ class BomberBotLite(BomberBot): punchiness = 0.2 throw_rate = 0.7 throwiness = 0.1 + charge_speed_min = 0.6 charge_speed_max = 0.6 From f61f55f905016af7b786d9ce17285c54a0fca6bd Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 2 Mar 2024 13:00:56 +0530 Subject: [PATCH 13/27] Update _subsystem.py --- src/assets/ba_data/python/bauiv1/_subsystem.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/assets/ba_data/python/bauiv1/_subsystem.py b/src/assets/ba_data/python/bauiv1/_subsystem.py index 34d7f5af..e5549609 100644 --- a/src/assets/ba_data/python/bauiv1/_subsystem.py +++ b/src/assets/ba_data/python/bauiv1/_subsystem.py @@ -43,7 +43,10 @@ class UIV1Subsystem(babase.AppSubsystem): self._uiscale: babase.UIScale - interfacetype = env['ui_scale'] + interfacetype = babase.app.config.get('UI Scale', env['ui_scale']) + if interfacetype == 'auto': + interfacetype = env['ui_scale'] + if interfacetype == 'large': self._uiscale = babase.UIScale.LARGE elif interfacetype == 'medium': From 002c317f493728977f3d2a3f503c00384bde5eff Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 2 Mar 2024 13:28:29 +0530 Subject: [PATCH 14/27] Add files via upload --- .../python/bauiv1lib/settings/advanced.py | 34 +++ .../python/bauiv1lib/settings/moddingtools.py | 208 ++++++++++++++++++ 2 files changed, 242 insertions(+) create mode 100644 src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py diff --git a/src/assets/ba_data/python/bauiv1lib/settings/advanced.py b/src/assets/ba_data/python/bauiv1lib/settings/advanced.py index 38285375..f9e2e8b1 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/advanced.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/advanced.py @@ -112,6 +112,7 @@ class AdvancedSettingsWindow(bui.Window): if self._do_net_test_button: self._sub_height += self._extra_button_spacing self._sub_height += self._spacing * 2.0 # plugins + self._sub_height += self._spacing * 2.0 # modding tools self._r = 'settingsWindowAdvanced' @@ -196,6 +197,7 @@ class AdvancedSettingsWindow(bui.Window): from bauiv1lib import promocode as _unused7 from bauiv1lib import debug as _unused8 from bauiv1lib.settings import plugins as _unused9 + from bauiv1lib.settings import moddingtools as _unused10 def _update_lang_status(self) -> None: if self._complete_langs_list is not None: @@ -575,6 +577,19 @@ class AdvancedSettingsWindow(bui.Window): bui.open_url, 'https://ballistica.net/wiki/modding-guide' ), ) + + v -= self._spacing * 2.0 + + self._modding_tools_button = bui.buttonwidget( + parent=self._subcontainer, + position=(self._sub_width / 2 - this_button_width / 2, v - 10), + size=(this_button_width, 60), + autoselect=True, + label=bui.Lstr(value='Modding Tools'), + text_scale=1.0, + on_activate_call=self._on_modding_tools_button_press, + ) + if self._show_always_use_internal_keyboard: assert self._always_use_internal_keyboard_check_box is not None bui.widget( @@ -763,6 +778,21 @@ class AdvancedSettingsWindow(bui.Window): from_window=self._root_widget, ) + def _on_modding_tools_button_press(self) -> None: + from bauiv1lib.settings.moddingtools import ModdingToolsWindow + + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + self._save_state() + bui.containerwidget(edit=self._root_widget, transition='out_left') + assert bui.app.classic is not None + bui.app.ui_v1.set_main_menu_window( + ModdingToolsWindow(origin_widget=self._modding_tools_button).get_root_widget(), + from_window=self._root_widget, + ) + def _on_promo_code_press(self) -> None: from bauiv1lib.promocode import PromoCodeWindow from bauiv1lib.account import show_sign_in_prompt @@ -848,6 +878,8 @@ class AdvancedSettingsWindow(bui.Window): sel_name = 'ShowUserMods' elif sel == self._plugins_button: sel_name = 'Plugins' + elif sel == self._modding_tools_button: + sel_name = 'ModdingTools' elif sel == self._modding_guide_button: sel_name = 'ModdingGuide' elif sel == self._language_inform_checkbox: @@ -915,6 +947,8 @@ class AdvancedSettingsWindow(bui.Window): sel = self._show_user_mods_button elif sel_name == 'Plugins': sel = self._plugins_button + elif sel_name == 'ModdingTools': + sel = self._modding_tools_button elif sel_name == 'ModdingGuide': sel = self._modding_guide_button elif sel_name == 'LangInform': diff --git a/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py b/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py new file mode 100644 index 00000000..163e3fa8 --- /dev/null +++ b/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py @@ -0,0 +1,208 @@ +# Released under the MIT License. See LICENSE for details. +# +"""UI functionality for Modding Tools.""" + +from __future__ import annotations + +import babase +import bauiv1 as bui +from bauiv1lib.popup import PopupMenu +from bauiv1lib.confirm import ConfirmWindow + +class ModdingToolsWindow(bui.Window): + """Window for accessing modding tools.""" + + def __init__( + self, + transition: str = 'in_right', + origin_widget: bui.Widget | None = None, + ): + + app = bui.app + assert app.classic is not None + + # If they provided an origin-widget, scale up from that. + scale_origin: tuple[float, float] | None + if origin_widget is not None: + self._transition_out = 'out_scale' + scale_origin = origin_widget.get_screen_space_center() + transition = 'in_scale' + else: + self._transition_out = 'out_right' + scale_origin = None + + uiscale = app.ui_v1.uiscale + self._width = 970.0 if uiscale is bui.UIScale.SMALL else 670.0 + x_inset = 150 if uiscale is bui.UIScale.SMALL else 0 + self._height = ( + 390.0 + if uiscale is bui.UIScale.SMALL + else 450.0 + if uiscale is bui.UIScale.MEDIUM + else 520.0 + ) + + self._spacing = 32 + top_extra = 10 if uiscale is bui.UIScale.SMALL else 0 + + self._scroll_width = self._width - (100 + 2 * x_inset) + self._scroll_height = self._height - 115.0 + self._sub_width = self._scroll_width * 0.95 + self._sub_height = 100.0 + + super().__init__( + root_widget=bui.containerwidget( + size=(self._width, self._height + top_extra), + transition=transition, + toolbar_visibility='menu_minimal', + scale_origin_stack_offset=scale_origin, + scale=( + 2.06 + if uiscale is bui.UIScale.SMALL + else 1.4 + if uiscale is bui.UIScale.MEDIUM + else 1.0 + ), + stack_offset=(0, -25) + if uiscale is bui.UIScale.SMALL + else (0, 0), + ) + ) + + self._r = 'settingsModdingTools' + + if app.ui_v1.use_toolbars and uiscale is bui.UIScale.SMALL: + bui.containerwidget( + edit=self._root_widget, on_cancel_call=self._do_back + ) + self._back_button = None + else: + self._back_button = bui.buttonwidget( + parent=self._root_widget, + position=(53 + x_inset, self._height - 60), + size=(140, 60), + scale=0.8, + autoselect=True, + label=bui.Lstr(resource='backText'), + button_type='back', + on_activate_call=self._do_back, + ) + bui.containerwidget( + edit=self._root_widget, cancel_button=self._back_button + ) + + self._title_text = bui.textwidget( + parent=self._root_widget, + position=(0, self._height - 52), + size=(self._width, 25), + # text=bui.Lstr(resource=f'{self._r}.titleText'), + text=bui.Lstr(value='Modding Tools'), + color=app.ui_v1.title_color, + h_align='center', + v_align='top', + ) + + if self._back_button is not None: + bui.buttonwidget( + edit=self._back_button, + button_type='backSmall', + size=(60, 60), + label=bui.charstr(bui.SpecialChar.BACK), + ) + + self._scrollwidget = bui.scrollwidget( + parent=self._root_widget, + position=(50 + x_inset, 50), + simple_culling_v=20.0, + highlight=False, + size=(self._scroll_width, self._scroll_height), + selection_loops_to_parent=True, + ) + bui.widget(edit=self._scrollwidget, right_widget=self._scrollwidget) + self._subcontainer = bui.containerwidget( + parent=self._scrollwidget, + size=(self._sub_width, self._sub_height), + background=False, + selection_loops_to_parent=True, + ) + + v = self._sub_height - 35 + this_button_width = 410 + + v -= self._spacing * 1.2 + self._create_user_system_scripts_button = bui.buttonwidget( + parent=self._subcontainer, + position=(self._sub_width / 2 - this_button_width / 2, v - 10), + size=(this_button_width, 60), + autoselect=True, + label=bui.Lstr(value='Create User System Scripts'), + text_scale=1.0, + on_activate_call=babase.modutils.create_user_system_scripts, + ) + + v -= self._spacing * 2.5 + self._delete_user_system_scripts_button = bui.buttonwidget( + parent=self._subcontainer, + position=(self._sub_width / 2 - this_button_width / 2, v - 10), + size=(this_button_width, 60), + autoselect=True, + label=bui.Lstr(value='Delete User System Scripts'), + text_scale=1.0, + on_activate_call=lambda: ConfirmWindow( + action=babase.modutils.delete_user_system_scripts, + ), + ) + + v -= self._spacing * 2.5 + bui.textwidget( + parent=self._subcontainer, + position=(170, v + 10), + size=(0, 0), + text=bui.Lstr(value='UI SIZE :'), + color=app.ui_v1.title_color, + h_align='center', + v_align='center', + ) + + PopupMenu( + parent=self._subcontainer, + position=(230, v - 20), + button_size=(200.0, 60.0), + choices=['auto','small', 'medium', 'large',], + choices_display=[ + bui.Lstr(value='autoText'), + bui.Lstr(value='smallText'), + bui.Lstr(value='mediumText'), + bui.Lstr(value='largeText'), + ], + current_choice=app.config.get('UI Scale', 'auto'), + on_value_change_call=self._set_uiscale, + ) + + def _set_uiscale(self, val: str) -> None: + cfg = bui.app.config + cfg['UI Scale'] = val + cfg.apply_and_commit() + if bui.app.ui_v1.uiscale.name != val.upper(): + bui.screenmessage( + bui.Lstr( + resource='settingsWindowAdvanced.mustRestartText' + ), + color=(1.0, 0.5, 0.0), + ) + + def _do_back(self) -> None: + from bauiv1lib.settings.advanced import AdvancedSettingsWindow + + # no-op if our underlying widget is dead or on its way out. + if not self._root_widget or self._root_widget.transitioning_out: + return + + bui.containerwidget( + edit=self._root_widget, transition=self._transition_out + ) + assert bui.app.classic is not None + bui.app.ui_v1.set_main_menu_window( + AdvancedSettingsWindow(transition='in_left').get_root_widget(), + from_window=self._root_widget, + ) \ No newline at end of file From ce089fed71877e52167fe6ef0d1c06a75cb14daa Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 2 Mar 2024 14:14:58 +0530 Subject: [PATCH 15/27] Fixing up a few stuff --- src/assets/ba_data/python/babase/modutils.py | 17 +++++++++++++---- .../python/bauiv1lib/settings/advanced.py | 9 +++++++-- .../python/bauiv1lib/settings/moddingtools.py | 17 ++++++++--------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/assets/ba_data/python/babase/modutils.py b/src/assets/ba_data/python/babase/modutils.py index 1608eb5c..3b1d14db 100644 --- a/src/assets/ba_data/python/babase/modutils.py +++ b/src/assets/ba_data/python/babase/modutils.py @@ -136,8 +136,16 @@ def create_user_system_scripts() -> None: path = f'{env.python_directory_user}/sys/{env.version}' pathtmp = path + '_tmp' if os.path.exists(path): - print('Delete Existing User Scripts and try again.') - _babase.screenmessage('Delete Existing User Scripts and try again.') + print('Delete Existing User Scripts,' + f'Restart {_babase.appname()} and try again.') + _babase.screenmessage( + 'Delete Existing User Scripts,', + color=(1, 0, 0) + ) + _babase.screenmessage( + f'Restart {_babase.appname()} and try again.', + color=(1, 0, 0) + ) return if os.path.exists(pathtmp): shutil.rmtree(pathtmp) @@ -161,7 +169,7 @@ def create_user_system_scripts() -> None: f"'\nRestart {_babase.appname()} to use them." f' (use babase.quit() to exit the game)' ) - _babase.screenmessage('Created User System Scripts') + _babase.screenmessage('Created User System Scripts', color=(0, 1, 0)) if app.classic is not None and app.classic.platform == 'android': print( 'Note: the new files may not be visible via ' @@ -186,9 +194,10 @@ def delete_user_system_scripts() -> None: f'Restart {_babase.appname()} to use internal' f' scripts. (use babase.quit() to exit the game)' ) - _babase.screenmessage('Deleted User System Scripts') + _babase.screenmessage('Deleted User System Scripts', color=(0, 1, 0)) else: print(f"User system scripts not found at '{path}'.") + _babase.screenmessage('User Scripts Not Found', color=(1, 0, 0)) # If the sys path is empty, kill it. dpath = env.python_directory_user + '/sys' diff --git a/src/assets/ba_data/python/bauiv1lib/settings/advanced.py b/src/assets/ba_data/python/bauiv1lib/settings/advanced.py index f9e2e8b1..677731de 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/advanced.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/advanced.py @@ -1,6 +1,7 @@ # Released under the MIT License. See LICENSE for details. # """UI functionality for advanced settings.""" +# pylint: disable=too-many-lines from __future__ import annotations @@ -585,7 +586,7 @@ class AdvancedSettingsWindow(bui.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 10), size=(this_button_width, 60), autoselect=True, - label=bui.Lstr(value='Modding Tools'), + label=bui.Lstr(resource=f'{self._r}.moddingToolsText'), text_scale=1.0, on_activate_call=self._on_modding_tools_button_press, ) @@ -779,6 +780,7 @@ class AdvancedSettingsWindow(bui.Window): ) def _on_modding_tools_button_press(self) -> None: + # pylint: disable=cyclic-import from bauiv1lib.settings.moddingtools import ModdingToolsWindow # no-op if our underlying widget is dead or on its way out. @@ -789,7 +791,9 @@ class AdvancedSettingsWindow(bui.Window): bui.containerwidget(edit=self._root_widget, transition='out_left') assert bui.app.classic is not None bui.app.ui_v1.set_main_menu_window( - ModdingToolsWindow(origin_widget=self._modding_tools_button).get_root_widget(), + ModdingToolsWindow( + origin_widget=self._modding_tools_button + ).get_root_widget(), from_window=self._root_widget, ) @@ -836,6 +840,7 @@ class AdvancedSettingsWindow(bui.Window): def _save_state(self) -> None: # pylint: disable=too-many-branches + # pylint: disable=too-many-statements try: sel = self._root_widget.get_selected_child() if sel == self._scrollwidget: diff --git a/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py b/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py index 163e3fa8..65222c85 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py @@ -95,8 +95,7 @@ class ModdingToolsWindow(bui.Window): parent=self._root_widget, position=(0, self._height - 52), size=(self._width, 25), - # text=bui.Lstr(resource=f'{self._r}.titleText'), - text=bui.Lstr(value='Modding Tools'), + text=bui.Lstr(resource='moddingToolsTitleText'), color=app.ui_v1.title_color, h_align='center', v_align='top', @@ -135,7 +134,7 @@ class ModdingToolsWindow(bui.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 10), size=(this_button_width, 60), autoselect=True, - label=bui.Lstr(value='Create User System Scripts'), + label=bui.Lstr(resource='createUserSystemScriptsText'), text_scale=1.0, on_activate_call=babase.modutils.create_user_system_scripts, ) @@ -146,7 +145,7 @@ class ModdingToolsWindow(bui.Window): position=(self._sub_width / 2 - this_button_width / 2, v - 10), size=(this_button_width, 60), autoselect=True, - label=bui.Lstr(value='Delete User System Scripts'), + label=bui.Lstr(resource='deleteUserSystemScriptsText'), text_scale=1.0, on_activate_call=lambda: ConfirmWindow( action=babase.modutils.delete_user_system_scripts, @@ -170,10 +169,10 @@ class ModdingToolsWindow(bui.Window): button_size=(200.0, 60.0), choices=['auto','small', 'medium', 'large',], choices_display=[ - bui.Lstr(value='autoText'), - bui.Lstr(value='smallText'), - bui.Lstr(value='mediumText'), - bui.Lstr(value='largeText'), + bui.Lstr(resource='autoText'), + bui.Lstr(resource='smallText'), + bui.Lstr(resource='mediumText'), + bui.Lstr(resource='largeText'), ], current_choice=app.config.get('UI Scale', 'auto'), on_value_change_call=self._set_uiscale, @@ -205,4 +204,4 @@ class ModdingToolsWindow(bui.Window): bui.app.ui_v1.set_main_menu_window( AdvancedSettingsWindow(transition='in_left').get_root_widget(), from_window=self._root_widget, - ) \ No newline at end of file + ) From 59b636dd8faece78301f18c0f473e3b4d91d6d0b Mon Sep 17 00:00:00 2001 From: Vishal Date: Sat, 2 Mar 2024 19:38:19 +0530 Subject: [PATCH 16/27] Update modutils.py --- src/assets/ba_data/python/babase/modutils.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/assets/ba_data/python/babase/modutils.py b/src/assets/ba_data/python/babase/modutils.py index 3b1d14db..08a58c71 100644 --- a/src/assets/ba_data/python/babase/modutils.py +++ b/src/assets/ba_data/python/babase/modutils.py @@ -136,15 +136,10 @@ def create_user_system_scripts() -> None: path = f'{env.python_directory_user}/sys/{env.version}' pathtmp = path + '_tmp' if os.path.exists(path): - print('Delete Existing User Scripts,' - f'Restart {_babase.appname()} and try again.') + print('Delete Existing User Scripts first!') _babase.screenmessage( - 'Delete Existing User Scripts,', - color=(1, 0, 0) - ) - _babase.screenmessage( - f'Restart {_babase.appname()} and try again.', - color=(1, 0, 0) + 'Delete Existing User Scripts first!', + color=(1, 0, 0), ) return if os.path.exists(pathtmp): @@ -195,6 +190,10 @@ def delete_user_system_scripts() -> None: f' scripts. (use babase.quit() to exit the game)' ) _babase.screenmessage('Deleted User System Scripts', color=(0, 1, 0)) + _babase.screenmessage( + f'Restart {_babase.appname()} to take effect.', + color=(0, 1, 0), + ) else: print(f"User system scripts not found at '{path}'.") _babase.screenmessage('User Scripts Not Found', color=(1, 0, 0)) From 839ba388c5f4f708090f0a9c65a62d41ae31247b Mon Sep 17 00:00:00 2001 From: 3alTemp Date: Sat, 2 Mar 2024 20:54:12 -0600 Subject: [PATCH 17/27] make update! --- src/assets/.asset_manifest_public.json | 2 ++ src/assets/Makefile | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/assets/.asset_manifest_public.json b/src/assets/.asset_manifest_public.json index 80f06984..575edf24 100644 --- a/src/assets/.asset_manifest_public.json +++ b/src/assets/.asset_manifest_public.json @@ -513,6 +513,7 @@ "ba_data/python/bauiv1lib/settings/__pycache__/gamepadselect.cpython-311.opt-1.pyc", "ba_data/python/bauiv1lib/settings/__pycache__/graphics.cpython-311.opt-1.pyc", "ba_data/python/bauiv1lib/settings/__pycache__/keyboard.cpython-311.opt-1.pyc", + "ba_data/python/bauiv1lib/settings/__pycache__/moddingtools.cpython-311.opt-1.pyc", "ba_data/python/bauiv1lib/settings/__pycache__/nettesting.cpython-311.opt-1.pyc", "ba_data/python/bauiv1lib/settings/__pycache__/plugins.cpython-311.opt-1.pyc", "ba_data/python/bauiv1lib/settings/__pycache__/pluginsettings.cpython-311.opt-1.pyc", @@ -529,6 +530,7 @@ "ba_data/python/bauiv1lib/settings/gamepadselect.py", "ba_data/python/bauiv1lib/settings/graphics.py", "ba_data/python/bauiv1lib/settings/keyboard.py", + "ba_data/python/bauiv1lib/settings/moddingtools.py", "ba_data/python/bauiv1lib/settings/nettesting.py", "ba_data/python/bauiv1lib/settings/plugins.py", "ba_data/python/bauiv1lib/settings/pluginsettings.py", diff --git a/src/assets/Makefile b/src/assets/Makefile index a92c9ad7..45bc5ee0 100644 --- a/src/assets/Makefile +++ b/src/assets/Makefile @@ -406,6 +406,7 @@ SCRIPT_TARGETS_PY_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/gamepadselect.py \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/graphics.py \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/keyboard.py \ + $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/moddingtools.py \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/nettesting.py \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/plugins.py \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/pluginsettings.py \ @@ -681,6 +682,7 @@ SCRIPT_TARGETS_PYC_PUBLIC = \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/gamepadselect.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/graphics.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/keyboard.cpython-311.opt-1.pyc \ + $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/moddingtools.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/nettesting.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/plugins.cpython-311.opt-1.pyc \ $(BUILD_DIR)/ba_data/python/bauiv1lib/settings/__pycache__/pluginsettings.cpython-311.opt-1.pyc \ From 460137bc3950fa7baef000997e550a10c9794ee7 Mon Sep 17 00:00:00 2001 From: 3alTemp Date: Tue, 5 Mar 2024 03:44:36 -0600 Subject: [PATCH 18/27] ough --- .../python/bascenev1lib/actor/respawnicon.py | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 6bf722af..13de4cc7 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -181,11 +181,24 @@ class RespawnIcon: offs_extra = -20 return on_right, offs_extra, icons - def _dec_step(self) -> None: - self._dec_text.node.text = self._dec_text.node.text[:-1] - # Kill our timer if the string is nothing. - if self._dec_text.node.text == '': + def _dec_step(self, display: list) -> None: + if not self._dec_text: self._dec_timer = None + return + old_text: str = self._dec_text.node.text + iter: int + # Get the following display text using our current one. + try: + iter = display.index(old_text) + 1 + # If we don't match any in the display list, we + # can assume we've just started iterating. + except ValueError: + iter = 0 + # Kill the timer if we're at the last iteration. + if iter >= len(display): + self._dec_timer = None + return + self._dec_text.node.text = display[iter] def _update(self) -> None: remaining = int(round(self._respawn_time - bs.time())) @@ -195,10 +208,16 @@ class RespawnIcon: if self._text.node: self._text.node.text = str(remaining) if self._dec_text: + # Display our decimal dots. self._dec_text.node.text = '...' - # Start our decimals timer + # Start the timer to tick down. self._dec_timer = bs.Timer( - 0.25, bs.WeakCall(self._dec_step), repeat=True + 0.25, + bs.WeakCall( + self._dec_step, + ['..','.',''] + ), + repeat=True ) else: self._visible = False From 6ac5959093753c58201c4449ca1c0ad86f9ad836 Mon Sep 17 00:00:00 2001 From: TrialTemp <79161340+3alTemp@users.noreply.github.com> Date: Tue, 5 Mar 2024 03:49:17 -0600 Subject: [PATCH 19/27] ough 2 --- .../ba_data/python/bascenev1lib/actor/respawnicon.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 13de4cc7..5b91d4b0 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -186,16 +186,16 @@ class RespawnIcon: self._dec_timer = None return old_text: str = self._dec_text.node.text - iter: int + iterate: int # Get the following display text using our current one. try: - iter = display.index(old_text) + 1 + iterate = display.index(old_text) + 1 # If we don't match any in the display list, we # can assume we've just started iterating. except ValueError: - iter = 0 + iterate = 0 # Kill the timer if we're at the last iteration. - if iter >= len(display): + if iterate >= len(display): self._dec_timer = None return self._dec_text.node.text = display[iter] From 80a2116ad8f323dc6c0ddcf83226142daabe17b3 Mon Sep 17 00:00:00 2001 From: 3alTemp Date: Tue, 5 Mar 2024 03:59:15 -0600 Subject: [PATCH 20/27] ough?? 3 --- src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 5b91d4b0..81383393 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -198,7 +198,7 @@ class RespawnIcon: if iterate >= len(display): self._dec_timer = None return - self._dec_text.node.text = display[iter] + self._dec_text.node.text = display[iterate] def _update(self) -> None: remaining = int(round(self._respawn_time - bs.time())) From e0505d651ca69be8526d518b4463045cd713c601 Mon Sep 17 00:00:00 2001 From: 3alTemp Date: Tue, 5 Mar 2024 04:05:24 -0600 Subject: [PATCH 21/27] _ --- src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 81383393..92d4cc8b 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -185,7 +185,7 @@ class RespawnIcon: if not self._dec_text: self._dec_timer = None return - old_text: str = self._dec_text.node.text + old_text: bs.Lstr | str = self._dec_text.node.text iterate: int # Get the following display text using our current one. try: From 57510085e580b2033ae564427231ac8a195e1799 Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Wed, 13 Mar 2024 11:49:40 -0600 Subject: [PATCH 22/27] ci compliant --- .../python/bascenev1lib/game/runaround.py | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/game/runaround.py b/src/assets/ba_data/python/bascenev1lib/game/runaround.py index 245ada60..c10cd3c5 100644 --- a/src/assets/ba_data/python/bascenev1lib/game/runaround.py +++ b/src/assets/ba_data/python/bascenev1lib/game/runaround.py @@ -522,18 +522,20 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): if self._lives == 0: self._bots.stop_moving() self.continue_or_end_game() - + # Heartbeat behavior if self._lives < 5: hbtime = 0.39 + (0.21 * self._lives) - self._lives_hbtime = bs.Timer(hbtime, - lambda: self.heart_dyin(True, hbtime), - repeat=True) + self._lives_hbtime = bs.Timer( + hbtime, + lambda: self.heart_dyin(True, hbtime), + repeat=True + ) self.heart_dyin(True) else: self._lives_hbtime = None self.heart_dyin(False) - + assert self._lives_text is not None assert self._lives_text.node self._lives_text.node.text = str(self._lives) @@ -1371,16 +1373,19 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): def _set_can_end_wave(self) -> None: self._can_end_wave = True - + def heart_dyin(self, status: bool, time: float = 1.22) -> None: """ Makes the UI heart beat at low health. """ - if not (self._lives_bg or - self._lives_bg.node.exists()): return - + assert self._lives_bg is not None + if ( + self._lives_bg is None + or self._lives_bg.node.exists() + ): + return heart = self._lives_bg.node - + # Make the heart beat intensely! if status: bs.animate_array(heart, 'scale', 2, { @@ -1396,6 +1401,6 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): # Neutralize heartbeat (Done did when dead.) else: bs.animate_array(heart, 'scale', 2, { - 0:heart.scale, - time:(90,90), + 0.0: heart.scale, + time: (90,90), }) From 2fdf006030654006b93c2fb9bc78c89a880c91de Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Wed, 13 Mar 2024 12:04:43 -0600 Subject: [PATCH 23/27] ci compliant? --- src/assets/ba_data/python/bascenev1lib/game/runaround.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/game/runaround.py b/src/assets/ba_data/python/bascenev1lib/game/runaround.py index 678369b4..94f831a4 100644 --- a/src/assets/ba_data/python/bascenev1lib/game/runaround.py +++ b/src/assets/ba_data/python/bascenev1lib/game/runaround.py @@ -1413,10 +1413,7 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): time: float = 1.22) -> None: """ Makes the UI heart beat at low health. """ assert self._lives_bg is not None - if ( - self._lives_bg is None - or self._lives_bg.node.exists() - ): + if self._lives_bg.node.exists(): return heart = self._lives_bg.node @@ -1434,7 +1431,8 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): # Neutralize heartbeat (Done did when dead.) else: + defscale: Sequence[float] = heart.scale bs.animate_array(heart, 'scale', 2, { - 0.0: heart.scale, + 0.0: defscale, time: (90,90), }) From 498e6acb7bd4d33c5641123ff26fe99720f880bf Mon Sep 17 00:00:00 2001 From: TrialTemp Date: Wed, 13 Mar 2024 12:12:34 -0600 Subject: [PATCH 24/27] brain hurting --- src/assets/ba_data/python/bascenev1lib/game/runaround.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/game/runaround.py b/src/assets/ba_data/python/bascenev1lib/game/runaround.py index 94f831a4..f94e2359 100644 --- a/src/assets/ba_data/python/bascenev1lib/game/runaround.py +++ b/src/assets/ba_data/python/bascenev1lib/game/runaround.py @@ -1431,8 +1431,7 @@ class RunaroundGame(bs.CoopGameActivity[Player, Team]): # Neutralize heartbeat (Done did when dead.) else: - defscale: Sequence[float] = heart.scale bs.animate_array(heart, 'scale', 2, { - 0.0: defscale, + 0.0: list(heart.scale), time: (90,90), }) From cfd09bd363cf20430bc8c85244778a9734de4b13 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 13 Mar 2024 16:10:37 -0700 Subject: [PATCH 25/27] tidying --- .efrocachemap | 42 +++++++++---------- CHANGELOG.md | 2 +- src/assets/ba_data/python/baenv.py | 2 +- .../ba_data/python/bauiv1lib/mainmenu.py | 13 +++--- .../base/graphics/text/text_graphics.cc | 6 +++ src/ballistica/shared/ballistica.cc | 2 +- 6 files changed, 38 insertions(+), 29 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index 3f0de8b8..9cce1353 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -421,7 +421,7 @@ "build/assets/ba_data/audio/zoeOw.ogg": "74befe45a8417e95b6a2233c51992a26", "build/assets/ba_data/audio/zoePickup01.ogg": "48ab8cddfcde36a750856f3f81dd20c8", "build/assets/ba_data/audio/zoeScream01.ogg": "2b468aedfa8741090247f04eb9e6df55", - "build/assets/ba_data/data/langdata.json": "0d9f610cd2284cad4316cc2cb131a08b", + "build/assets/ba_data/data/langdata.json": "8409781047f46ca6627eacdfc0b4d3d3", "build/assets/ba_data/data/languages/arabic.json": "2c2915e10124bb8f69206da9c608d57c", "build/assets/ba_data/data/languages/belarussian.json": "09954e550d13d3d9cb5a635a1d32a151", "build/assets/ba_data/data/languages/chinese.json": "bb51b5aa614830c561e8fe2542a9ab8a", @@ -4061,26 +4061,26 @@ "build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1", "build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "88c4aa547dd4715a2e272f3738587b6d", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "f16453fcad766fec901df5b49c30f3c8", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "b70afa60a1a41edab49b1aaa3a5c64bb", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "604ec018ae78313c48536ed729d27466", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "4902925ae1a5e1d985ce96071af3aade", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "d3d70106be65df66be7ac08a6b486e37", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "d086c930efa95aad560591f76188620e", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "55c591cc3150103361816404a6b39f93", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "3fc3fb6d92f28ac3a2cadf00e3a9a69b", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "403004d2b9a7a0a051e5943a8c1d423a", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "5de045f8c27357a3123f5e9f81a1019a", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "5dbea7c2327da665dd3ec3a99c81b3b2", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "89c5f534a3ebf919d3cf095f15abf2dd", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "3b45bc9d1be09e8236a2b9f11331026e", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "6e7174e340c82df192385b8a828a6dcd", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "5ddcb009ae84e70ef82dc13b4952f706", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "fd35547e009f1f7237b057a1dc5ba043", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "6f68f2749227bc3c0774bc3e6b16d520", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "1073911522710591baa6d37fe0dbcb2c", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "a7986fae95855606844a9ad39bd0ec00", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "db921cf43e8ebf733712fb5bbc673f66", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "4be0f3a7a88da423847863af41ac9c63", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "7c92d738e7cc724de2ca31cb876224e6", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "c2f69ed83f77b602e2a2b2b1c1c78cc6", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "b1c766d4ce567f965c53ff2a4c5c85f4", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "86ebbd9111f8a0fe7905cef7aba1f6db", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "8182f4e00ad579eb4c7be5ec1ddca8cb", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "3d9e0e7ad8706133e61fb7f7127c3ff5", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "20373ee90f8987bed980143d5377ae44", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "99d7d247a422eaa46737e3232408e879", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "079c4fd0b6f8aa50510064704466904b", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "216efc77915b75f39f0f15c2806bfbb9", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "204320756307e1833b284c3180e70319", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "3e9e4e1761fd763eb584598fc0a3ad0a", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "b8f587f21f39f35072d6c83116c9ae96", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "0c92e386ab7406da6a719131321bf592", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "ce48b60be52023e1942cb493bb2f58fb", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "d53ee4e8eed3e1a218db2f927a62c353", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "6597b00a07975230cb3f5b0fa19e0ed4", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "0ff41b8dc440c0490e9ae3bc22c3d201", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "d9865523059d8cf11b2bef4b9da9a8c9", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "56d6440f62c271c4ce9ef520400395a3", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "d9865523059d8cf11b2bef4b9da9a8c9", diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d86100d..c12aafbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.33 (build 21777, api 8, 2024-03-13) +### 1.7.33 (build 21778, api 8, 2024-03-13) - Stress test input-devices are now a bit smarter; they won't press any buttons while UIs are up (this could cause lots of chaos if it happened). - Added a 'Show Demos When Idle' option in advanced settings. If enabled, the diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 605e2f39..697bffcd 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -52,7 +52,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21777 +TARGET_BALLISTICA_BUILD = 21778 TARGET_BALLISTICA_VERSION = '1.7.33' diff --git a/src/assets/ba_data/python/bauiv1lib/mainmenu.py b/src/assets/ba_data/python/bauiv1lib/mainmenu.py index 8d667843..48242d9c 100644 --- a/src/assets/ba_data/python/bauiv1lib/mainmenu.py +++ b/src/assets/ba_data/python/bauiv1lib/mainmenu.py @@ -454,7 +454,7 @@ class MainMenuWindow(bui.Window): resource='watchWindow.playbackSpeedText', subs=[('${SPEED}', str(1.23))], ), - position=(h, v + v_offs + 7 * t_scale), + position=(h, v + v_offs + 15 * t_scale), h_align='center', v_align='center', size=(0, 0), @@ -543,7 +543,8 @@ class MainMenuWindow(bui.Window): bui.textwidget( parent=self._root_widget, draw_controller=btn, - text='<<', + # text='<<', + text=bui.charstr(bui.SpecialChar.REWIND_BUTTON), position=( h - b_size - b_buffer_1 * 2, v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, @@ -568,7 +569,8 @@ class MainMenuWindow(bui.Window): bui.textwidget( parent=self._root_widget, draw_controller=btn, - text='>>', + # text='>>', + text=bui.charstr(bui.SpecialChar.FAST_FORWARD_BUTTON), position=( h + b_size + b_buffer_1 * 2, v - b_size * 0.5 - b_buffer_2 + 5 * t_scale + v_offs, @@ -1454,8 +1456,9 @@ class MainMenuWindow(bui.Window): def _resume(self) -> None: assert bui.app.classic is not None bui.app.classic.resume() - if self._root_widget: - bui.containerwidget(edit=self._root_widget, transition='out_right') + # if self._root_widget: + # bui.containerwidget(edit=self._root_widget, + # transition='out_right') bui.app.ui_v1.clear_main_menu_window(transition='out_right') # If there's callbacks waiting for this window to go away, call them. diff --git a/src/ballistica/base/graphics/text/text_graphics.cc b/src/ballistica/base/graphics/text/text_graphics.cc index fae81787..dd13a924 100644 --- a/src/ballistica/base/graphics/text/text_graphics.cc +++ b/src/ballistica/base/graphics/text/text_graphics.cc @@ -47,6 +47,12 @@ TextGraphics::TextGraphics() { g.pen_offset_y -= 0.1f; } + // Bring Fast Forward & Rewind down and to the left a bit. + if (index == 13 || index == 15) { + g.pen_offset_y -= 0.055; + g.pen_offset_x -= 0.01; + } + // Shrink account logos and move them up a bit. if (index == 29 || index == 32 || index == 33 || index == 38 || index == 40 || index == 48 || index == 49) { diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 6e96d188..1e716406 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int { namespace ballistica { // These are set automatically via script; don't modify them here. -const int kEngineBuildNumber = 21777; +const int kEngineBuildNumber = 21778; const char* kEngineVersion = "1.7.33"; const int kEngineApiVersion = 8; From c6e8869678267862f08c537655d4541e044df8a7 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 13 Mar 2024 16:28:03 -0700 Subject: [PATCH 26/27] Latest public/internal sync. --- .../python/bascenev1lib/actor/respawnicon.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py index 92d4cc8b..59aa8810 100644 --- a/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py +++ b/src/assets/ba_data/python/bascenev1lib/actor/respawnicon.py @@ -213,14 +213,11 @@ class RespawnIcon: # Start the timer to tick down. self._dec_timer = bs.Timer( 0.25, - bs.WeakCall( - self._dec_step, - ['..','.',''] - ), - repeat=True + bs.WeakCall(self._dec_step, ['..', '.', '']), + repeat=True, ) else: self._visible = False - self._image = ( - self._text - ) = self._dec_text = self._timer = self._name = None + self._image = self._text = self._dec_text = self._timer = ( + self._name + ) = None From 68acd9eb857ef52d79da5bfb781ce39062bbc818 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 13 Mar 2024 17:11:17 -0700 Subject: [PATCH 27/27] public/internal sync --- .../python/bauiv1lib/settings/moddingtools.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py b/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py index 65222c85..a4307360 100644 --- a/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py +++ b/src/assets/ba_data/python/bauiv1lib/settings/moddingtools.py @@ -9,6 +9,7 @@ import bauiv1 as bui from bauiv1lib.popup import PopupMenu from bauiv1lib.confirm import ConfirmWindow + class ModdingToolsWindow(bui.Window): """Window for accessing modding tools.""" @@ -37,9 +38,7 @@ class ModdingToolsWindow(bui.Window): self._height = ( 390.0 if uiscale is bui.UIScale.SMALL - else 450.0 - if uiscale is bui.UIScale.MEDIUM - else 520.0 + else 450.0 if uiscale is bui.UIScale.MEDIUM else 520.0 ) self._spacing = 32 @@ -59,13 +58,11 @@ class ModdingToolsWindow(bui.Window): scale=( 2.06 if uiscale is bui.UIScale.SMALL - else 1.4 - if uiscale is bui.UIScale.MEDIUM - else 1.0 + else 1.4 if uiscale is bui.UIScale.MEDIUM else 1.0 + ), + stack_offset=( + (0, -25) if uiscale is bui.UIScale.SMALL else (0, 0) ), - stack_offset=(0, -25) - if uiscale is bui.UIScale.SMALL - else (0, 0), ) ) @@ -167,7 +164,12 @@ class ModdingToolsWindow(bui.Window): parent=self._subcontainer, position=(230, v - 20), button_size=(200.0, 60.0), - choices=['auto','small', 'medium', 'large',], + choices=[ + 'auto', + 'small', + 'medium', + 'large', + ], choices_display=[ bui.Lstr(resource='autoText'), bui.Lstr(resource='smallText'), @@ -184,9 +186,7 @@ class ModdingToolsWindow(bui.Window): cfg.apply_and_commit() if bui.app.ui_v1.uiscale.name != val.upper(): bui.screenmessage( - bui.Lstr( - resource='settingsWindowAdvanced.mustRestartText' - ), + bui.Lstr(resource='settingsWindowAdvanced.mustRestartText'), color=(1.0, 0.5, 0.0), )