diff --git a/.efrocachemap b/.efrocachemap index 4dee47a3..0fd7e7b8 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -420,21 +420,21 @@ "assets/build/ba_data/audio/zoeOw.ogg": "https://files.ballistica.net/cache/ba1/dc/d2/160fc27fcaff10793327ac2c70fd", "assets/build/ba_data/audio/zoePickup01.ogg": "https://files.ballistica.net/cache/ba1/11/7a/87d6bca0acfb877fd4fd8fe3a598", "assets/build/ba_data/audio/zoeScream01.ogg": "https://files.ballistica.net/cache/ba1/44/f5/c943c9075abb3e1835d2408a1ef8", - "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/08/f4/15b670652c536067374b14a0097c", + "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/c4/e7/432f66c84194bd6d04ecc485e308", "assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/4c/fd/67a9dcdecb85dbaf549a8fbbdc78", "assets/build/ba_data/data/languages/belarussian.json": "https://files.ballistica.net/cache/ba1/61/03/89070ca765e06da3a419a579f503", "assets/build/ba_data/data/languages/chinese.json": "https://files.ballistica.net/cache/ba1/32/a7/b9208ab804dfe2d1c3960256e9f8", "assets/build/ba_data/data/languages/chinesetraditional.json": "https://files.ballistica.net/cache/ba1/61/e6/caf06ce99017fdf5d2da0c038445", - "assets/build/ba_data/data/languages/croatian.json": "https://files.ballistica.net/cache/ba1/28/46/3a36628a033da4d4b4ea65b78a28", + "assets/build/ba_data/data/languages/croatian.json": "https://files.ballistica.net/cache/ba1/f5/d4/683ef2d47b669e5f177bc1ae4ff0", "assets/build/ba_data/data/languages/czech.json": "https://files.ballistica.net/cache/ba1/87/84/9f3d39610453b3bf350698a23316", "assets/build/ba_data/data/languages/danish.json": "https://files.ballistica.net/cache/ba1/3f/46/e4da3c1d2b0ebf916df55c608b28", "assets/build/ba_data/data/languages/dutch.json": "https://files.ballistica.net/cache/ba1/68/93/da8e9874f41a786edf52ba4ccaad", - "assets/build/ba_data/data/languages/english.json": "https://files.ballistica.net/cache/ba1/e2/7e/d09eefebb683de87d3845f1f74f4", + "assets/build/ba_data/data/languages/english.json": "https://files.ballistica.net/cache/ba1/b9/72/96f5843dffe76fd16fa691845497", "assets/build/ba_data/data/languages/esperanto.json": "https://files.ballistica.net/cache/ba1/4c/c7/0184b8178869d1a3827a1bfcd5bb", - "assets/build/ba_data/data/languages/filipino.json": "https://files.ballistica.net/cache/ba1/4b/f2/6b17381862e41b3be7ddce5d296d", + "assets/build/ba_data/data/languages/filipino.json": "https://files.ballistica.net/cache/ba1/f8/ac/ade62ff2a8c13550f56c918d55fb", "assets/build/ba_data/data/languages/french.json": "https://files.ballistica.net/cache/ba1/b6/e0/37dd30b686f475733ccc4b3cab49", "assets/build/ba_data/data/languages/german.json": "https://files.ballistica.net/cache/ba1/c0/26/04875251b9237f3133c84a910afd", - "assets/build/ba_data/data/languages/gibberish.json": "https://files.ballistica.net/cache/ba1/f9/c2/d9889ac09067d7f073f5ee005740", + "assets/build/ba_data/data/languages/gibberish.json": "https://files.ballistica.net/cache/ba1/6b/f3/5ca25b080c7f04403ffd1c918787", "assets/build/ba_data/data/languages/greek.json": "https://files.ballistica.net/cache/ba1/82/eb/37ff44af76812097f9c98f05c730", "assets/build/ba_data/data/languages/hindi.json": "https://files.ballistica.net/cache/ba1/08/3b/68cea4d16f7020d932829af85323", "assets/build/ba_data/data/languages/hungarian.json": "https://files.ballistica.net/cache/ba1/b0/48/e1ebe08bfdfc94fcb61a16b851e5", @@ -443,18 +443,18 @@ "assets/build/ba_data/data/languages/korean.json": "https://files.ballistica.net/cache/ba1/07/37/ab65ccee3a555bd40e9661860c58", "assets/build/ba_data/data/languages/persian.json": "https://files.ballistica.net/cache/ba1/02/ab/e310f81582b6dc2ae93348d45166", "assets/build/ba_data/data/languages/polish.json": "https://files.ballistica.net/cache/ba1/76/be/84e567de0aabd9f9145b62179c2c", - "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/26/41/f1246ab56c6b7853f605c3a95889", + "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/e2/cd/8738b4ac572fc3f98714a4a4be67", "assets/build/ba_data/data/languages/romanian.json": "https://files.ballistica.net/cache/ba1/c9/5c/ccbae41f2baa11599563b4aabe00", "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/8c/a7/1dea3643720ced9fa40a0b3d1add", "assets/build/ba_data/data/languages/serbian.json": "https://files.ballistica.net/cache/ba1/13/19/828be486951be254445263f36c6e", "assets/build/ba_data/data/languages/slovak.json": "https://files.ballistica.net/cache/ba1/f9/4b/d9f01814224066856695452ef57c", "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/b3/a3/3e1befdc621a503219fa78ba6d8b", "assets/build/ba_data/data/languages/swedish.json": "https://files.ballistica.net/cache/ba1/91/0a/35c4baf539d5951fc03a794c0e0b", - "assets/build/ba_data/data/languages/tamil.json": "https://files.ballistica.net/cache/ba1/16/8f/30ba7e59d25748b76af1743a5686", + "assets/build/ba_data/data/languages/tamil.json": "https://files.ballistica.net/cache/ba1/75/b3/c344f382251cb7e696bedb712421", "assets/build/ba_data/data/languages/thai.json": "https://files.ballistica.net/cache/ba1/9d/51/f699dbd4beb88bc3cff699a287a7", "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/6f/2e/20bed8fefb23ca42c18a7b6c75b2", "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/7f/bb/6239adeb551be5e09f3457d7b411", - "assets/build/ba_data/data/languages/venetian.json": "https://files.ballistica.net/cache/ba1/e2/e1/b815d9f2e9b2c3a4daddaf728225", + "assets/build/ba_data/data/languages/venetian.json": "https://files.ballistica.net/cache/ba1/d9/97/e3ec72c08fcaeb2f69569c20f085", "assets/build/ba_data/data/languages/vietnamese.json": "https://files.ballistica.net/cache/ba1/f2/af/afd1503c7a10cacaa15bc02369b2", "assets/build/ba_data/data/maps/big_g.json": "https://files.ballistica.net/cache/ba1/47/0a/a617cc85d927b576c4e6fc1091ed", "assets/build/ba_data/data/maps/bridgit.json": "https://files.ballistica.net/cache/ba1/03/4b/57ee9b42854b26f23f81bd8c58ef", @@ -3992,26 +3992,26 @@ "assets/src/ba_data/python/ba/_generated/__init__.py": "https://files.ballistica.net/cache/ba1/ee/e8/cad05aa531c7faf7ff7b96db7f6e", "assets/src/ba_data/python/ba/_generated/enums.py": "https://files.ballistica.net/cache/ba1/b2/e5/0ee0561e16257a32830645239f34", "ballisticacore-windows/Generic/BallisticaCore.ico": "https://files.ballistica.net/cache/ba1/89/c0/e32c7d2a35dc9aef57cc73b0911a", - "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/15/d2/1a406b0b7e999e8aa662b52d04e9", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/2d/dc/cc6582bcb2eb248dc475c7d4494d", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3b/1d/6f9bbaaf443e222b479ab5b8a591", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/22/88/b04e74dbc00d435e3a8267c7f602", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/14/31/a8d35d1b4a1cfe687e959e8b5d73", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/f4/5a/d79e44ef4b78c0fd259fd8b145aa", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0c/51/926b9b9ca55b84db740be8dd811f", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/35/e7/1d06c3c41c7fac2f19d8ddbfb260", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/4e/8e/9fd62508758abc41804ea7483534", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/32/8e/d55d91a23defc5f3dcc9308afc6a", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ab/92/d7e8c5cdda5c6434c7d78a7c725c", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fc/44/28f780d39db0cd0eaaecdb9c74c8", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/25/89/b1c5f1dffd8e15d1a0dfe34e05e6", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/13/e7/2c15ca0d38d3e6dcf730d3df3073", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/11/8e/da14bd06757a23c8e0839c33925a", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9f/a5/38b0fc67536dda40901ac518a92a", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/e8/16/88ebb15d93868a5060c77d98c693", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/88/1b/0b5e22fc847f71005add59642d27", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/71/15/68af3e30dfc3a5f24551c0562bb4", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/95/1e/15388f9638f7ceedb2950f8ee48b", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8c/d5/fba79229deede06e5b031a87157f", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/54/2b/673fa74014cf61159cb54c1108b2", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/17/53/abb7da95eae90b11633c63393818", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/57/aa/75c12cfcd4e3808816ba13209ed1", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/c7/78/e6c34d274e0fe86c5c353e020443", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/94/15/df389e478c6ed7e882eb0d5256b9", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/b4/91/12712fd256f857dc495463946657", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/17/e0/eae88b03b5633ff79c3f6b016c4b", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/82/df/f255e2b59b9088d55b035115e44b", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/d1/30/d2dbc28b610f8b95ef9b3c3ff7c9", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ab/dc/8aff10d5b007669a786605682259", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e8/86/4c4ca5e324176f2efe1e8fa1b430", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/9b/2b/4fea397239bc255bee521eb1dbb0", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/59/df/34794ec6cef67f9c62d120b1eec0", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c9/0b/cfbfa79dc9b9647734376d9dcd20", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/14/e6/bbfd8659960b2986cb9610d31d6a", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/b5/96/80efe4c008a59cace8ff8ccdd3bc", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/31/47/ec287452c4a01db5491e89c051d0", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/57/84/c6257839b104458099b183b24afd", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/77/cb/d10b854cfb3dc39f1387563888c2", "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3f/60/5fb1cb5bd1ee656517914df2eb26", "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/95/92/1bac3bcac3e1f71417b7ff053b52", "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/54/55/b16bb20de7c3ab30311e73707e17", diff --git a/CHANGELOG.md b/CHANGELOG.md index c2560608..e9aa5b7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### 1.7.3 (20623, 2022-06-30) +- Fixed an issue with King of the Hill flag regions not working when players entered them (Thanks itsre3!) +- Fixed an issue in Chosen One where the flag resetting on top of a player would not cause them to become the chosen one (Thanks Dliwk!) +- Fixed an issue where triple-bomb powerup would not flash before wearing off (Thanks Juleskie!). +- Fixed an issue where syncing workspaces containing large files could error. +- Net-testing window now requires you to be signed in instead of giving an error result in that case. +- The app now issues a gentle notice if plugins are removed instead of erroring and continuing to look for them on subsequent launches. This makes things much smoother when switching between workspaces or users. +- Added new translation entries for Workspace/Plugin stuff. + ### 1.7.2 (20620, 2022-06-25) - Minor fixes in some minigames (Thanks Droopy!) - Fixed a bug preventing 'clients' arg from working in _ba.chatmessage (Thanks imayushsaini!) diff --git a/assets/src/ba_data/python/ba/_plugin.py b/assets/src/ba_data/python/ba/_plugin.py index d59cb638..6a3f2e84 100644 --- a/assets/src/ba_data/python/ba/_plugin.py +++ b/assets/src/ba_data/python/ba/_plugin.py @@ -66,6 +66,7 @@ class PluginSubsystem: def load_plugins(self) -> None: """(internal)""" from ba._general import getclass + from ba._language import Lstr # Note: the plugins we load is purely based on what's enabled # in the app config. Our meta-scan gives us a list of available @@ -76,15 +77,21 @@ class PluginSubsystem: assert isinstance(plugstates, dict) plugkeys: list[str] = sorted(key for key, val in plugstates.items() if val.get('enabled', False)) + disappeared_plugs: set[str] = set() for plugkey in plugkeys: try: cls = getclass(plugkey, Plugin) + except ModuleNotFoundError: + disappeared_plugs.add(plugkey) + continue except Exception as exc: _ba.playsound(_ba.getsound('error')) - # TODO: Lstr. - errstr = f"Error loading plugin class '{plugkey}': {exc}" - _ba.screenmessage(errstr, color=(1, 0, 0)) - _ba.log(errstr, to_server=False) + _ba.screenmessage(Lstr(resource='pluginClassLoadErrorText', + subs=[('${PLUGIN}', plugkey), + ('${ERROR}', str(exc))]), + color=(1, 0, 0)) + _ba.log(f"Error loading plugin class '{plugkey}': {exc}", + to_server=False) continue try: plugin = cls() @@ -93,10 +100,29 @@ class PluginSubsystem: except Exception as exc: from ba import _error _ba.playsound(_ba.getsound('error')) - # TODO: Lstr. - _ba.screenmessage(f"Error loading plugin: '{plugkey}': {exc}", + _ba.screenmessage(Lstr(resource='pluginInitErrorText', + subs=[('${PLUGIN}', plugkey), + ('${ERROR}', str(exc))]), color=(1, 0, 0)) - _error.print_exception(f"Error loading plugin: '{plugkey}'.") + _error.print_exception(f"Error initing plugin: '{plugkey}'.") + + # If plugins disappeared, let the user know gently and remove them + # from the config so we'll again let the user know if they later + # reappear. This makes it much smoother to switch between users + # or workspaces. + if disappeared_plugs: + _ba.playsound(_ba.getsound('shieldDown')) + _ba.screenmessage(Lstr(resource='pluginsRemovedText', + subs=[('${NUM}', + str(len(disappeared_plugs)))]), + color=(1, 1, 0)) + _ba.log( + f'{len(disappeared_plugs)} plugin(s) no longer found:' + f' {disappeared_plugs}', + to_server=False) + for goneplug in disappeared_plugs: + del _ba.app.config['Plugins'][goneplug] + _ba.app.config.commit() @dataclass diff --git a/assets/src/ba_data/python/ba/_workspace.py b/assets/src/ba_data/python/ba/_workspace.py index debbdb13..72f7343e 100644 --- a/assets/src/ba_data/python/ba/_workspace.py +++ b/assets/src/ba_data/python/ba/_workspace.py @@ -52,17 +52,17 @@ class WorkspaceSubsystem: daemon=True, ).start() - def _errmsg(self, msg: str | ba.Lstr) -> None: + def _errmsg(self, msg: ba.Lstr) -> None: _ba.screenmessage(msg, color=(1, 0, 0)) _ba.playsound(_ba.getsound('error')) - def _successmsg(self, msg: str | ba.Lstr) -> None: + def _successmsg(self, msg: ba.Lstr) -> None: _ba.screenmessage(msg, color=(0, 1, 0)) _ba.playsound(_ba.getsound('gunCocking')) def _set_active_workspace_bg(self, workspaceid: str, workspacename: str, on_completed: Callable[[], None]) -> None: - # pylint: disable=too-many-branches + from ba._language import Lstr class _SkipSyncError(RuntimeError): pass @@ -101,45 +101,42 @@ class WorkspaceSubsystem: break state.iteration += 1 - extras: list[str] = [] - # Hmm; let's not show deletes for now since currently lots of - # .pyc files get deleted. - if bool(False): - if state.total_deletes: - extras.append(f'{state.total_deletes} files deleted') - if state.total_downloads: - extras.append(f'{state.total_downloads} files downloaded') - if state.total_up_to_date: - extras.append(f'{state.total_up_to_date} files up-to-date') - # Actually let's try with none of this; seems a bit excessive. - if bool(False) and extras: - extras_s = '\n' + ', '.join(extras) + '.' - else: - extras_s = '' - _ba.pushcall(tpartial(self._successmsg, - f'{workspacename} activated.{extras_s}'), - from_other_thread=True) + _ba.pushcall( + tpartial( + self._successmsg, + Lstr(resource='activatedText', + subs=[('${THING}', workspacename)]), + ), + from_other_thread=True, + ) except _SkipSyncError: - _ba.pushcall(tpartial( - self._errmsg, f'Can\'t sync {workspacename}' - f'. Reusing previous synced version.'), - from_other_thread=True) + _ba.pushcall( + tpartial( + self._errmsg, + Lstr(resource='workspaceSyncReuseText', + subs=[('$WORKSPACE', workspacename)])), + from_other_thread=True, + ) except CleanError as exc: # Avoid reusing existing if we fail in the middle; could # be in wonky state. set_path = False - _ba.pushcall(tpartial(self._errmsg, str(exc)), + _ba.pushcall(tpartial(self._errmsg, Lstr(value=str(exc))), from_other_thread=True) except Exception: # Ditto. set_path = False - logging.exception('Error syncing workspace.') - # TODO: Lstr. - _ba.pushcall(tpartial( - self._errmsg, 'Error syncing workspace. See log for details.'), - from_other_thread=True) + logging.exception("Error syncing workspace '%s'.", workspacename) + _ba.pushcall( + tpartial( + self._errmsg, + Lstr(resource='workspaceSyncErrorText', + subs=[('${WORKSPACE}', workspacename)]), + ), + from_other_thread=True, + ) if set_path and wspath.is_dir(): # Add to Python paths and also to list of stuff to be scanned diff --git a/assets/src/ba_data/python/bastd/ui/settings/advanced.py b/assets/src/ba_data/python/bastd/ui/settings/advanced.py index 1774f37b..7336a992 100644 --- a/assets/src/ba_data/python/bastd/ui/settings/advanced.py +++ b/assets/src/ba_data/python/bastd/ui/settings/advanced.py @@ -542,6 +542,14 @@ class AdvancedSettingsWindow(ba.Window): def _on_net_test_press(self) -> None: from bastd.ui.settings.nettesting import NetTestingWindow + + # Net-testing requires a signed in v1 account. + if _ba.get_v1_account_state() != 'signed_in': + ba.screenmessage(ba.Lstr(resource='notSignedInErrorText'), + color=(1, 0, 0)) + ba.playsound(ba.getsound('error')) + return + self._save_state() ba.containerwidget(edit=self._root_widget, transition='out_left') ba.app.ui.set_main_menu_window( diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index 76a50ce0..8415b93d 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -21,8 +21,8 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20620; -const char* kAppVersion = "1.7.2"; +const int kAppBuildNumber = 20623; +const char* kAppVersion = "1.7.3"; // Our standalone globals. // These are separated out for easy access.