From ab62e1994f80f488bc1c570a53228bbdc0f95d67 Mon Sep 17 00:00:00 2001 From: Eric Froemling Date: Mon, 20 Jan 2025 11:31:01 -0800 Subject: [PATCH] more translations and live updating msg claim expire time --- .efrocachemap | 60 +++++------ CHANGELOG.md | 2 +- src/assets/ba_data/python/baenv.py | 2 +- src/assets/ba_data/python/bauiv1lib/inbox.py | 102 ++++++++++++++++++- src/ballistica/shared/ballistica.cc | 2 +- tools/bacommon/bs.py | 18 ++++ 6 files changed, 150 insertions(+), 36 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index 04bb77c1..462f6056 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -432,21 +432,21 @@ "build/assets/ba_data/audio/zoeOw.ogg": "b2d705c31c9dcc1efdc71394764c3beb", "build/assets/ba_data/audio/zoePickup01.ogg": "e9366dc2d2b8ab8b0c4e2c14c02d0789", "build/assets/ba_data/audio/zoeScream01.ogg": "903e0e45ee9b3373e9d9ce20c814374e", - "build/assets/ba_data/data/langdata.json": "ba264ce70e370aed4815cc59692e66ef", + "build/assets/ba_data/data/langdata.json": "4295c4d16e5ac2853572e363ad20434c", "build/assets/ba_data/data/languages/arabic.json": "32b9849fb8389b8c7798f0b744620318", "build/assets/ba_data/data/languages/belarussian.json": "009b452aa308bf2b2f7e92d9b78ba5ff", "build/assets/ba_data/data/languages/chinese.json": "5363a79f843e6be7ef47a840f47cc17d", - "build/assets/ba_data/data/languages/chinesetraditional.json": "32f53581b80ce723edbe8aa7956e6727", + "build/assets/ba_data/data/languages/chinesetraditional.json": "bea0f9c17324591b8261015cbd80a265", "build/assets/ba_data/data/languages/croatian.json": "66be7ada024c5d5cf813a07b75217e48", "build/assets/ba_data/data/languages/czech.json": "3418bee44e69be13b7f72996abe96921", "build/assets/ba_data/data/languages/danish.json": "8e57db30c5250df2abff14a822f83ea7", "build/assets/ba_data/data/languages/dutch.json": "4ba5bbcc0fecddd0aac6ee2c165d1e40", - "build/assets/ba_data/data/languages/english.json": "cde7a60508100173973a16293ff79077", + "build/assets/ba_data/data/languages/english.json": "8e4940f0ee5af3e32701391a9c0ba14c", "build/assets/ba_data/data/languages/esperanto.json": "0e397cfa5f3fb8cef5f4a64f21cda880", "build/assets/ba_data/data/languages/filipino.json": "1894fc331dcad7ce9cf4c180843f548f", "build/assets/ba_data/data/languages/french.json": "6d20655730b1017ef187fd828b91d43c", "build/assets/ba_data/data/languages/german.json": "bc656f1ada467161c23546f48d0dacc5", - "build/assets/ba_data/data/languages/gibberish.json": "ac45c86b24a676d7936929ba8801f75f", + "build/assets/ba_data/data/languages/gibberish.json": "df28ac4b33ba8fee62c26cff05aa6b13", "build/assets/ba_data/data/languages/greek.json": "d28d1092fbb00ed857cbd53124c0dc78", "build/assets/ba_data/data/languages/hindi.json": "567e6976b3c72f891431ad7fcc62ab16", "build/assets/ba_data/data/languages/hungarian.json": "af801baffb2c06460635dfb04c34bb3e", @@ -455,14 +455,14 @@ "build/assets/ba_data/data/languages/korean.json": "360760d72832863e1a3451b0a514cb08", "build/assets/ba_data/data/languages/malay.json": "0212e18e54efa202c17505376e5b82fb", "build/assets/ba_data/data/languages/persian.json": "517217e679c768fff4ffec7f8000ab77", - "build/assets/ba_data/data/languages/piratespeak.json": "be23decfaf220b3aa3de3cf35e59b420", + "build/assets/ba_data/data/languages/piratespeak.json": "e93ca3bed6c5218e4788021514dbde76", "build/assets/ba_data/data/languages/polish.json": "993b612c5854fc42a78726ed09c65251", "build/assets/ba_data/data/languages/portuguese.json": "0828a749b6441121828c126ff608b0ba", "build/assets/ba_data/data/languages/romanian.json": "b04345d8c7631d657a69c73eb7be755a", "build/assets/ba_data/data/languages/russian.json": "70cd57440e4cbb49f2fa0c79dedcafbe", "build/assets/ba_data/data/languages/serbian.json": "623fa4129a1154c2f32ed7867e56ff6a", "build/assets/ba_data/data/languages/slovak.json": "c11c29708b3742cdc2a92b4fa0d6d29f", - "build/assets/ba_data/data/languages/spanish.json": "cca1358d25e8e71ba9eec54341e8df6f", + "build/assets/ba_data/data/languages/spanish.json": "6bd5b7461bd9f5c3d51cbae4a7b629bc", "build/assets/ba_data/data/languages/swedish.json": "3b179e7333183c70adb0811246b09959", "build/assets/ba_data/data/languages/tamil.json": "ead39b864228696a9b0d19344bc4b5ec", "build/assets/ba_data/data/languages/thai.json": "383540a1e9c7c131ac579f51afc87471", @@ -4174,22 +4174,22 @@ "build/assets/windows/Win32/ucrtbased.dll": "bfd1180c269d3950b76f35a63655e9e1", "build/assets/windows/Win32/vc_redist.x86.exe": "15a5f1f876503885adbdf5b3989b3718", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "9fe0194ff2f6b7363a5d3a06dd06b37f", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "f2a795a990f0dfaea9134af9407badd1", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "c61a560de21247175261d223de16d403", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "1c0274bb083949b05930b1ab4e3c1b7b", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "62e1861d5a129636d91f2e95441ecf02", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "db087754b233d353187b30c4cb93806e", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "b7ffe69fefbfd2b4b30e702c4d3db1fc", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "a01d54acf558ad4b8a68ad4bb73e2d3a", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "9f4fb98a5cbab26e36979b3aa7f26981", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "0637fd3a40a5220bf68c030c32c0c94d", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "97df23a219f5c9ff4f1e7fea3a821a1f", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "40e15078db0b1c993b9d164459ffcd92", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "1798bdc143986033a723bea929afb076", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "e61a718c983d2b880d24a23633a0eafa", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "a7354e98bcbe4e87f8e1729f71b6407c", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "1a51d072caf08d89147446841e838273", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "b9e84b8bbb7b0a18e13bb77ecf2badf5", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "aad705b76936e969e16ac655b39741fb", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "962bdb3f45a3ab26802ae5197f706f7a", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "76a018c645116fa7bced0f036272b4f9", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "2e0df651d38aafbf4978cd3d3da4f3f5", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "eb6abd114cf782987639aca6178f19e9", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "2fdc6c30924860abe46db3bc6151c9e6", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "2109ef88ea6b1c90fe6ed5000c245826", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "dd7a5d15cc9f22953ca28cbd747768a5", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "5594e0bc8b12ba148ac4c0828254f6c8", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "fce6180332211d56df0c1042f43490da", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "da6bd64d89ee7160503ba94451f12842", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "5b74bfad2153b5f76ee95c7817ac87a8", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "0ba1bd838f8f078e819078f16cfaabcb", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "85b30746328af3b85f6e33658add7587", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "0740d2c2ea2002615a75fade5c73d406", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "7497894d2943b75b6ac830cdba8481af", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "273a6f64cac5a233694223b85cd0f22b", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "7497894d2943b75b6ac830cdba8481af", @@ -4202,14 +4202,14 @@ "build/prefab/lib/mac_arm64_gui/release/libballisticaplus.a": "7e071962108a8d1727525fb331b70ee4", "build/prefab/lib/mac_arm64_server/debug/libballisticaplus.a": "55a2b0c2d1db4d70627c901471d05fc7", "build/prefab/lib/mac_arm64_server/release/libballisticaplus.a": "7e071962108a8d1727525fb331b70ee4", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "52d5d23f1c4f1d8f3f444d84e7c6eedd", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "8516053e839fac9c014669555c16552e", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "96ed1d3dac7a1a961c727a1697feb122", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "b28963810cca19f3ec32bdf1ba39852f", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "5fd9bd7df2be3347fd686df6c6017214", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "e2215b2837db9ee041c6fc215110f807", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "1c2319c70a9e7dee3f56dcc030f1ad84", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "51bd82b3cea8c35ba8df869f4d2ab686", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "02bc17952ad62734a95641a8f1714777", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "aacdc0153fc5698ea20b0cc02555a002", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "6c36b05ef61b3508a555bb9d47ff8331", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "cbcad50064e76b09962f5220f1c5f4d6", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "4b86041719e2f263e8567f1847738964", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "d8bfaf6093aa96533f1ba13bee227b0a", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "5c9bc97e877b7c37783bb94f293a8ac0", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "edc49d5f30f4e941e15317ed9d0c1cee", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "794d258d59fd17a61752843a9a0551ad", "src/ballistica/base/mgen/pyembed/binding_base.inc": "06042d31df0ff9af96b99477162e2a91", diff --git a/CHANGELOG.md b/CHANGELOG.md index 713bea00..22d36b65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.37 (build 22216, api 9, 2025-01-20) +### 1.7.37 (build 22218, api 9, 2025-01-20) - Bumping api version to 9. As you'll see below, there's some UI changes that will require a bit of work for any UI mods to adapt to. If your mods don't touch UI stuff at all you can simply bump your api version and call it a day. diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 5e52257b..b2282121 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -53,7 +53,7 @@ if TYPE_CHECKING: # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 22216 +TARGET_BALLISTICA_BUILD = 22218 TARGET_BALLISTICA_VERSION = '1.7.37' diff --git a/src/assets/ba_data/python/bauiv1lib/inbox.py b/src/assets/ba_data/python/bauiv1lib/inbox.py index 0533b406..6c232568 100644 --- a/src/assets/ba_data/python/bauiv1lib/inbox.py +++ b/src/assets/ba_data/python/bauiv1lib/inbox.py @@ -16,6 +16,7 @@ import bacommon.bs import bauiv1 as bui if TYPE_CHECKING: + import datetime from typing import Callable @@ -36,9 +37,9 @@ class _TextSection(_Section): def __init__( self, + *, sub_width: float, text: bui.Lstr | str, - *, spacing_top: float = 0.0, spacing_bottom: float = 0.0, scale: float = 0.6, @@ -96,9 +97,9 @@ class _ButtonSection(_Section): def __init__( self, + *, sub_width: float, label: bui.Lstr | str, - *, color: tuple[float, float, float], label_color: tuple[float, float, float], call: Callable[[_ButtonSection], None], @@ -159,10 +160,10 @@ class _DisplayItemsSection(_Section): def __init__( self, + *, sub_width: float, items: list[bacommon.bs.DisplayItemWrapper], width: float = 100.0, - *, spacing_top: float = 0.0, spacing_bottom: float = 0.0, ) -> None: @@ -205,6 +206,88 @@ class _DisplayItemsSection(_Section): x += xspacing +class _ExpireTimeSection(_Section): + + def __init__( + self, + *, + sub_width: float, + time: datetime.datetime, + spacing_top: float = 0.0, + spacing_bottom: float = 0.0, + ) -> None: + self.time = time + self.sub_width = sub_width + self.spacing_top = spacing_top + self.spacing_bottom = spacing_bottom + self.color = (1.0, 0.0, 1.0) + self._timer: bui.AppTimer | None = None + self._widget: bui.Widget | None = None + self.text_scale = 0.4 + self.text_height = 30.0 * self.text_scale + self.full_height = self.text_height + spacing_top + spacing_bottom + + @override + def get_height(self) -> float: + return self.full_height + + def _update(self) -> None: + if not self._widget: + return + + now = bui.utc_now_cloud() + + val: bui.Lstr + if now < self.time: + color = (1.0, 1.0, 1.0, 0.3) + val = bui.Lstr( + resource='expiresInText', + subs=[ + ( + '${T}', + bui.timestring( + (self.time - now).total_seconds(), centi=False + ), + ), + ], + ) + else: + color = (1.0, 0.3, 0.3, 0.5) + val = bui.Lstr( + resource='expiredAgoText', + subs=[ + ( + '${T}', + bui.timestring( + (now - self.time).total_seconds(), centi=False + ), + ), + ], + ) + bui.textwidget(edit=self._widget, text=val, color=color) + + @override + def emit(self, subcontainer: bui.Widget, y: float) -> None: + self._widget = bui.textwidget( + parent=subcontainer, + position=( + self.sub_width * 0.5, + y - self.spacing_top - self.text_height * 0.5, + ), + color=self.color, + scale=self.text_scale, + flatness=1.0, + shadow=1.0, + text='', + maxwidth=self.sub_width * 0.7, + size=(0, 0), + h_align='center', + v_align='center', + ) + self._timer = bui.AppTimer(1.0, bui.WeakCall(self._update), repeat=True) + self._update() + + @dataclass class _EntryDisplay: interaction_style: bacommon.bs.BasicClientUI.InteractionStyle @@ -822,6 +905,19 @@ class InboxWindow(bui.MainWindow): total_height += section.get_height() sections.append(section) + elif ctypeid is idcls.EXPIRE_TIME: + assert isinstance( + component, bacommon.bs.BasicClientUIExpireTime + ) + section = _ExpireTimeSection( + sub_width=sub_width, + time=component.time, + spacing_top=component.spacing_top, + spacing_bottom=component.spacing_bottom, + ) + total_height += section.get_height() + sections.append(section) + elif ctypeid is idcls.UNKNOWN: raise RuntimeError('Should not get here.') diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index 3c0f4321..27f29842 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 = 22216; +const int kEngineBuildNumber = 22218; const char* kEngineVersion = "1.7.37"; const int kEngineApiVersion = 9; diff --git a/tools/bacommon/bs.py b/tools/bacommon/bs.py index b0c4fdba..5a74dad3 100644 --- a/tools/bacommon/bs.py +++ b/tools/bacommon/bs.py @@ -461,6 +461,7 @@ class BasicClientUIComponentTypeID(Enum): LINK = 'l' BS_CLASSIC_TOURNEY_RESULT = 'ct' DISPLAY_ITEMS = 'di' + EXPIRE_TIME = 'd' class BasicClientUIComponent(IOMultiType[BasicClientUIComponentTypeID]): @@ -493,6 +494,8 @@ class BasicClientUIComponent(IOMultiType[BasicClientUIComponentTypeID]): return BasicClientUIBsClassicTourneyResult if type_id is t.DISPLAY_ITEMS: return BasicClientUIDisplayItems + if type_id is t.EXPIRE_TIME: + return BasicClientUIExpireTime # Important to make sure we provide all types. assert_never(type_id) @@ -596,6 +599,21 @@ class BasicClientUIDisplayItems(BasicClientUIComponent): return BasicClientUIComponentTypeID.DISPLAY_ITEMS +@ioprepped +@dataclass +class BasicClientUIExpireTime(BasicClientUIComponent): + """Show expire-time.""" + + time: Annotated[datetime.datetime, IOAttrs('d')] + spacing_top: Annotated[float, IOAttrs('st', store_default=False)] = 0.0 + spacing_bottom: Annotated[float, IOAttrs('sb', store_default=False)] = 0.0 + + @override + @classmethod + def get_type_id(cls) -> BasicClientUIComponentTypeID: + return BasicClientUIComponentTypeID.EXPIRE_TIME + + @ioprepped @dataclass class BasicClientUI(ClientUI):