diff --git a/.efrocachemap b/.efrocachemap
index 0fd7e7b8..a1eef795 100644
--- a/.efrocachemap
+++ b/.efrocachemap
@@ -944,11 +944,11 @@
"assets/build/ba_data/models/zoeUpperArm.bob": "https://files.ballistica.net/cache/ba1/99/38/b7694cae0804260eeb337aa1676a",
"assets/build/ba_data/models/zoeUpperLeg.bob": "https://files.ballistica.net/cache/ba1/83/4f/28b2202d0109fa93272c0b09fa2d",
"assets/build/ba_data/python-site-packages/_yaml/__init__.py": "https://files.ballistica.net/cache/ba1/0d/45/65ba92f51d411dcffac8835b6130",
- "assets/build/ba_data/python-site-packages/certifi/__init__.py": "https://files.ballistica.net/cache/ba1/6d/50/5ccd19e3e711e761aaad65b6e9c7",
+ "assets/build/ba_data/python-site-packages/certifi/__init__.py": "https://files.ballistica.net/cache/ba1/ca/90/4cf111df6bafc9735f6d2a05d6f2",
"assets/build/ba_data/python-site-packages/certifi/__main__.py": "https://files.ballistica.net/cache/ba1/b2/bb/d7d8216212bcf66cdc3067700fb7",
- "assets/build/ba_data/python-site-packages/certifi/cacert.pem": "https://files.ballistica.net/cache/ba1/f3/72/0988233f002061ec2bddbcdb0ece",
+ "assets/build/ba_data/python-site-packages/certifi/cacert.pem": "https://files.ballistica.net/cache/ba1/c9/f9/e2d0dd61a7f4e36a3309a3981d07",
"assets/build/ba_data/python-site-packages/certifi/core.py": "https://files.ballistica.net/cache/ba1/8a/01/33e774b2ed89a56756f32d2f3bef",
- "assets/build/ba_data/python-site-packages/typing_extensions.py": "https://files.ballistica.net/cache/ba1/b6/df/c941d69b4a09ff4650b3780cb423",
+ "assets/build/ba_data/python-site-packages/typing_extensions.py": "https://files.ballistica.net/cache/ba1/a5/c3/66c408bfad73af8644f507d8ee17",
"assets/build/ba_data/python-site-packages/yaml/__init__.py": "https://files.ballistica.net/cache/ba1/e5/47/17715ca7620f3b9749558b9dcb2d",
"assets/build/ba_data/python-site-packages/yaml/composer.py": "https://files.ballistica.net/cache/ba1/3e/aa/d7fcfc4707ad19a6964d72654b82",
"assets/build/ba_data/python-site-packages/yaml/constructor.py": "https://files.ballistica.net/cache/ba1/f4/29/cd8c7f5a2296d8f1715ad49b5797",
@@ -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/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/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/14/32/34006cd68ca39d27add8c36839a9",
+ "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/f9/27/943498c90fd48490581721549831",
+ "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/99/ee/a7e516ce3d295c32a9fae1f61837",
+ "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/33/1c/c84d7e2f9108787614e8fa47b178",
+ "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/66/ca/89977fb3b87de266a9da81655879",
+ "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/50/ed/fa670d5646074507df2bd11cc9f3",
+ "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5d/e1/7dde73d49d729d4ad722d7042821",
+ "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3a/57/a994445b5ba27e8b21df9218f05f",
+ "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/3b/db/742462576b3e78cc42cbe8c15b4d",
+ "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/98/52/3dd887570176346b2b0a9c40658e",
+ "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ad/26/9bc36871955e6bafc5a5c6f21e74",
+ "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5e/94/f021148e84ed3ba2997c51c701bf",
+ "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/2b/11/63ecf6112d1a3ea71ee31c192d32",
+ "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ae/5a/bc6c4c10a64fb230edb1d16ec0e7",
+ "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/76/ce/ba8b95c2ea1fbef5ee6fc22fc421",
+ "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/bf/b3/6b576d8587719ec0f9dcdc851613",
+ "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/a6/25/6c769b43530cc0f5870fde6b01f4",
+ "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/4f/b2/915fa6ee32e67839fdab20b20e9f",
+ "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/54/a0/02d658b28cee638eb2587e5800af",
+ "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/e7/56/3aa98841dab173ddfe3e4c7dd19e",
"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",
@@ -4028,14 +4028,14 @@
"build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/bc/c0/1230a5a3ff3786fc335b57800324",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b5/7f/0e2c1cf8683876727192587148ac",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fe/04/375a70cb1510e2ec904a8d413a84",
- "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/95/fd/76e14f54aa05b9893d7e51a9b72f",
- "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/5f/2a/3f294394d9b3cac746e72d12371a",
- "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/18/12/6ce38decdc15438730d6599e1205",
- "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/cf/1e/cfc52166831c2845b52c3fdfe97e",
- "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/8a/1e/496af892e73099ad8d019f48c0d6",
- "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/94/be/26c915da46e21c50c266e5067fab",
- "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/a4/e4/58fbe24e57b0cd7ccfc89b728c9a",
- "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/83/20/3576abd41776af09082ebc4e798c",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/09/77/21bbba5f4a88b3534e133dc156d5",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/72/95/fc9be2f3b29b4bcc19079269d4b3",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/19/d8/d2728c0e48b220b7c20e2690ecae",
+ "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/07/d6/d4305dab6a066c0a1459efcec85e",
+ "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/75/26/dc45c1c15b7727a013fd98ce1796",
+ "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/ee/39/9498eb5c1103b27df3454b52ba98",
+ "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/61/b1/3ab8780ac812d4cdedf19f504aaa",
+ "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/43/90/175c959c383fe983a614f92b6dec",
"src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/6e/6f/004b696e9a13b083069374e4bb6a",
"src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/d3/db/e73d4dcf1280d5f677c3cf8b47c3"
}
\ No newline at end of file
diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml
index 7cd468d9..10dd41b6 100644
--- a/.idea/dictionaries/ericf.xml
+++ b/.idea/dictionaries/ericf.xml
@@ -822,6 +822,7 @@
fdout
fecfc
feedparser
+ fentry
ffaeff
ffap
ffbbdf
@@ -1047,6 +1048,7 @@
gname
gnode
goles
+ goneplug
goodlist
googleplaytab
googlevr
@@ -1225,6 +1227,7 @@
isysroot
itms
itmsp
+ itsre
itunes
itunesconnectutils
ival
@@ -1250,6 +1253,7 @@
jsonstrbase
jsontools
jsonutils
+ juleskie
kbclass
kbytecount
keepalive
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e9aa5b7e..05a8793f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-### 1.7.3 (20623, 2022-06-30)
+### 1.7.3 (20627, 2022-07-01)
- 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!).
@@ -6,6 +6,7 @@
- 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.
+- tools/bacloud workspace get/put commands are now functional (wiki page with instructions coming soon).
### 1.7.2 (20620, 2022-06-25)
- Minor fixes in some minigames (Thanks Droopy!)
diff --git a/ballisticacore-cmake/.idea/dictionaries/ericf.xml b/ballisticacore-cmake/.idea/dictionaries/ericf.xml
index c0cb9fc6..07e928a0 100644
--- a/ballisticacore-cmake/.idea/dictionaries/ericf.xml
+++ b/ballisticacore-cmake/.idea/dictionaries/ericf.xml
@@ -420,6 +420,7 @@
fdirx
fdiry
fdirz
+ fentry
fenv
fesetround
ffbbdf
@@ -530,6 +531,7 @@
gles
glext
globalns
+ goneplug
googleplaytab
gpgs
gqualstr
@@ -621,6 +623,7 @@
itemsize
itri
itsclass
+ itsre
itunes
itunesconnectutils
ival
@@ -638,6 +641,7 @@
jmessage
jnames
json's
+ juleskie
keepalives
kerploople
keyanntype
diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc
index 8415b93d..45c608fc 100644
--- a/src/ballistica/ballistica.cc
+++ b/src/ballistica/ballistica.cc
@@ -21,7 +21,7 @@
namespace ballistica {
// These are set automatically via script; don't modify them here.
-const int kAppBuildNumber = 20623;
+const int kAppBuildNumber = 20627;
const char* kAppVersion = "1.7.3";
// Our standalone globals.
diff --git a/tools/bacommon/bacloud.py b/tools/bacommon/bacloud.py
index 99c9be3b..5ce38d3c 100644
--- a/tools/bacommon/bacloud.py
+++ b/tools/bacommon/bacloud.py
@@ -14,7 +14,7 @@ if TYPE_CHECKING:
# Version is sent to the master-server with all commands. Can be incremented
# if we need to change behavior server-side to go along with client changes.
-BACLOUD_VERSION = 6
+BACLOUD_VERSION = 7
@ioprepped
diff --git a/tools/bacommon/transfer.py b/tools/bacommon/transfer.py
index 03ff6bdb..65042879 100644
--- a/tools/bacommon/transfer.py
+++ b/tools/bacommon/transfer.py
@@ -5,13 +5,14 @@
from __future__ import annotations
import os
+from pathlib import Path
from dataclasses import dataclass
from typing import TYPE_CHECKING, Annotated
from efro.dataclassio import ioprepped, IOAttrs
if TYPE_CHECKING:
- from pathlib import Path
+ pass
@ioprepped
@@ -40,15 +41,17 @@ class DirectoryManifest:
paths: list[str] = []
if path.is_dir():
- # Build the full list of package-relative paths.
+ # Build the full list of relative paths.
for basename, _dirnames, filenames in os.walk(path):
for filename in filenames:
fullname = os.path.join(basename, filename)
assert fullname.startswith(pathstr)
- paths.append(fullname[len(pathstr) + 1:])
+ # Make sure we end up with forward slashes no matter
+ # what the os.* stuff above here was using.
+ paths.append(Path(fullname[len(pathstr) + 1:]).as_posix())
elif path.exists():
# Just return a single file entry if path is not a dir.
- paths.append(pathstr)
+ paths.append(path.as_posix())
def _get_file_info(filepath: str) -> tuple[str, DirectoryManifestFile]:
sha = hashlib.sha256()
@@ -70,6 +73,18 @@ class DirectoryManifest:
with ThreadPoolExecutor(max_workers=cpus) as executor:
return cls(files=dict(executor.map(_get_file_info, paths)))
+ def validate(self) -> None:
+ """Log any odd data in the manifest; for debugging."""
+ import logging
+ for fpath, _fentry in self.files.items():
+ # We want to be dealing in only forward slashes; make sure
+ # that's the case (wondering if we'll ever see backslashes
+ # for escape purposes).
+ if '\\' in fpath:
+ logging.exception("Found unusual path in manifest: '%s'.",
+ fpath)
+ break # 1 error is enough for now.
+
@classmethod
def get_empty_hash(cls) -> str:
"""Return the hash for an empty file."""
diff --git a/tools/batools/build.py b/tools/batools/build.py
index 63e0ee4a..8d70913b 100644
--- a/tools/batools/build.py
+++ b/tools/batools/build.py
@@ -38,7 +38,7 @@ class PipRequirement:
# installing it. And as far as manually-installed bits, pip itself must
# have some way to allow for that, right?...
PIP_REQUIREMENTS = [
- PipRequirement(modulename='pylint', minversion=[2, 14, 2]),
+ PipRequirement(modulename='pylint', minversion=[2, 14, 4]),
PipRequirement(modulename='mypy', minversion=[0, 961]),
PipRequirement(modulename='yapf', minversion=[0, 32, 0]),
PipRequirement(modulename='cpplint', minversion=[1, 6, 0]),
@@ -48,7 +48,7 @@ PIP_REQUIREMENTS = [
PipRequirement(modulename='yaml', pipname='PyYAML'),
PipRequirement(modulename='requests'),
PipRequirement(modulename='pdoc'),
- PipRequirement(pipname='typing_extensions', minversion=[4, 2, 0]),
+ PipRequirement(pipname='typing_extensions', minversion=[4, 3, 0]),
PipRequirement(pipname='types-filelock', minversion=[3, 2, 6]),
PipRequirement(pipname='types-requests', minversion=[2, 27, 29]),
PipRequirement(pipname='types-pytz', minversion=[2021, 3, 8]),
diff --git a/tools/efro/rpc.py b/tools/efro/rpc.py
index c9e52aeb..1797164c 100644
--- a/tools/efro/rpc.py
+++ b/tools/efro/rpc.py
@@ -13,8 +13,8 @@ from dataclasses import dataclass
from threading import current_thread
from typing import TYPE_CHECKING, Annotated
-from efro.error import CommunicationError, is_asyncio_streams_network_error
from efro.util import assert_never
+from efro.error import CommunicationError, is_asyncio_streams_network_error
from efro.dataclassio import (dataclass_to_json, dataclass_from_json,
ioprepped, IOAttrs)
diff --git a/tools/efro/util.py b/tools/efro/util.py
index cc4342ab..d9d3634a 100644
--- a/tools/efro/util.py
+++ b/tools/efro/util.py
@@ -637,9 +637,11 @@ def compact_id(num: int) -> str:
'abcdefghijklmnopqrstuvwxyz')
+# NOTE: Even though this is available as part of typing_extensions, keeping
+# it in here for now so we don't require typing_extensions as a dependency.
+# Once 3.11 rolls around we can kill this and use typing.assert_never.
def assert_never(value: NoReturn) -> NoReturn:
"""Trick for checking exhaustive handling of Enums, etc.
-
See https://github.com/python/typing/issues/735
"""
assert False, f'Unhandled value: {value} ({type(value).__name__})'
diff --git a/tools/efrotools/xcode.py b/tools/efrotools/xcode.py
index 70f0e7b8..21334a23 100644
--- a/tools/efrotools/xcode.py
+++ b/tools/efrotools/xcode.py
@@ -13,9 +13,9 @@ import shlex
from enum import Enum
from typing import TYPE_CHECKING
+from efro.util import assert_never
from efro.terminal import Clr
from efro.error import CleanError
-from efro.util import assert_never
if TYPE_CHECKING:
from typing import Any