Skip to content

Commit 522b7b3

Browse files
committed
Terrain nodes can now be positioned/rotated (scene-v1 protocol 41); new Enable XInput option on Windows; more UI text moved to translatable strings; UI automation helpers and asset-resolve robustness improvements.
1 parent 50ac14b commit 522b7b3

91 files changed

Lines changed: 1520 additions & 417 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.efrocachemap

Lines changed: 45 additions & 45 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
### 1.8.0 (build 22966, api 9, 2026-08-06)
1+
### 1.8.0 (build 22967, api 9, 2026-08-08)
22
- Fully implemented asset packages (more on this soon)
33
- Upgraded to Python 3.14. This gives us a few nice useful bits such as zstd
44
compression to help speed up online stuff and also means we can get rid of all
@@ -18,6 +18,10 @@
1818
- Upgraded Windows builds from VS2022 to VS2026.
1919
- Added password option to game hosting.
2020
- Button and image widgets can now be rotated (thanks vishal332008!)
21+
- Terrain nodes now have `position` and `rotate` attrs, so a terrain can be
22+
placed and oriented instead of being stuck wherever its mesh was authored.
23+
Rendering, collision, and bg-dynamics (debris/smoke/shadows) all follow.
24+
Note that this bumps the scene-v1 protocol to 41 (thanks vishal332008!)
2125
- Renamed the `BaStdAssets` asset package to `BaClassicAssets`; its client
2226
wrapper modules are now `bauiv1.classicassets` / `bascenev1.classicassets`
2327
(previously `stdassets`).

CHANGELOG_API_VERSIONS.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ available builds.
6161
values and player-customized names are plain strings. If you assign an
6262
`Lstr` it is flattened to a `str`, so team names you set will no longer
6363
re-translate when the language changes; assign a `LangStr` to keep that.
64+
- `bascenev1.InputDevice.get_button_name()` now returns a `LangStr` rather
65+
than an `Lstr`. It could not take a `langstr` argument like the calls above
66+
because it is implemented natively and the old return value existed only to
67+
be converted straight back for display. Calling `.evaluate()` on the result
68+
or passing it to a text/label slot works unchanged; the one thing that
69+
breaks is using the result as a substitution inside an `Lstr`, which
70+
`LangStr` values cannot ride. A side benefit: generic names such as
71+
'button 5' now re-translate when the language changes instead of being
72+
baked at the time you asked for them.
6473
- `ba*.Call()` will change to behave like `ba*.CallStrict()` instead of
6574
`ba*.CallPartial()`. To prepare for this, change all of your existing `Call()`
6675
usage to `CallPartial()` to lock in current behavior. Or use `CallStrict()` if

ballisticakit-cmake/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ set(BALLISTICA_SOURCES
407407
${BA_SRC_ROOT}/ballistica/base/dynamics/bg/bg_dynamics_volume_light_data.h
408408
${BA_SRC_ROOT}/ballistica/base/dynamics/collision_cache.cc
409409
${BA_SRC_ROOT}/ballistica/base/dynamics/collision_cache.h
410+
${BA_SRC_ROOT}/ballistica/base/dynamics/geom_transform.h
410411
${BA_SRC_ROOT}/ballistica/base/graphics/component/empty_component.h
411412
${BA_SRC_ROOT}/ballistica/base/graphics/component/object_component.cc
412413
${BA_SRC_ROOT}/ballistica/base/graphics/component/object_component.h

ballisticakit-windows/Generic/BallisticaKitGeneric.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@
276276
<ClInclude Include="..\..\src\ballistica\base\dynamics\bg\bg_dynamics_volume_light_data.h" />
277277
<ClCompile Include="..\..\src\ballistica\base\dynamics\collision_cache.cc" />
278278
<ClInclude Include="..\..\src\ballistica\base\dynamics\collision_cache.h" />
279+
<ClInclude Include="..\..\src\ballistica\base\dynamics\geom_transform.h" />
279280
<ClInclude Include="..\..\src\ballistica\base\graphics\component\empty_component.h" />
280281
<ClCompile Include="..\..\src\ballistica\base\graphics\component\object_component.cc" />
281282
<ClInclude Include="..\..\src\ballistica\base\graphics\component\object_component.h" />

ballisticakit-windows/Generic/BallisticaKitGeneric.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@
256256
<ClInclude Include="..\..\src\ballistica\base\dynamics\collision_cache.h">
257257
<Filter>ballistica\base\dynamics</Filter>
258258
</ClInclude>
259+
<ClInclude Include="..\..\src\ballistica\base\dynamics\geom_transform.h">
260+
<Filter>ballistica\base\dynamics</Filter>
261+
</ClInclude>
259262
<ClInclude Include="..\..\src\ballistica\base\graphics\component\empty_component.h">
260263
<Filter>ballistica\base\graphics\component</Filter>
261264
</ClInclude>

ballisticakit-windows/Headless/BallisticaKitHeadless.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@
269269
<ClInclude Include="..\..\src\ballistica\base\dynamics\bg\bg_dynamics_volume_light_data.h" />
270270
<ClCompile Include="..\..\src\ballistica\base\dynamics\collision_cache.cc" />
271271
<ClInclude Include="..\..\src\ballistica\base\dynamics\collision_cache.h" />
272+
<ClInclude Include="..\..\src\ballistica\base\dynamics\geom_transform.h" />
272273
<ClInclude Include="..\..\src\ballistica\base\graphics\component\empty_component.h" />
273274
<ClCompile Include="..\..\src\ballistica\base\graphics\component\object_component.cc" />
274275
<ClInclude Include="..\..\src\ballistica\base\graphics\component\object_component.h" />

ballisticakit-windows/Headless/BallisticaKitHeadless.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@
256256
<ClInclude Include="..\..\src\ballistica\base\dynamics\collision_cache.h">
257257
<Filter>ballistica\base\dynamics</Filter>
258258
</ClInclude>
259+
<ClInclude Include="..\..\src\ballistica\base\dynamics\geom_transform.h">
260+
<Filter>ballistica\base\dynamics</Filter>
261+
</ClInclude>
259262
<ClInclude Include="..\..\src\ballistica\base\graphics\component\empty_component.h">
260263
<Filter>ballistica\base\graphics\component</Filter>
261264
</ClInclude>

docs/design/client-ssl-trust.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Client SSL Trust
2+
3+
**Description:** Why bring-our-own-Python builds trust the bundled certifi store ONLY (cafile= skips the OS store), the Windows expired-legacy-root failure it prevents, and the BA_USE_SYSTEM_CERTS escape hatch.
4+
5+
In builds that bring their own Python distribution, client TLS trust
6+
comes from the bundled certifi store and nothing else — the OS
7+
certificate store is deliberately never loaded. This page records the
8+
mechanism, the concrete Windows failure that motivated it, and the
9+
escape hatch for environments that genuinely need OS-store roots.
10+
11+
## Policy and mechanism
12+
13+
- **`baenv._setup_certs`**
14+
(`src/assets/ba_data/python/baenv.py`) — in bring-our-own-Python
15+
builds (`contains_python_dist`, or forced via
16+
`BA_USE_BUNDLED_ROOT_CERTS=1`) it sets
17+
`SSL_CERT_FILE = REQUESTS_CA_BUNDLE = certifi.where()`.
18+
- **The single shared SSL context** is built in
19+
`babase/_env.py` `_bootstrap_networking`
20+
(`_g_net_warm_start_ssl_context`, exposed as `app.net.sslcontext` +
21+
`app.net.urllib3pool`; all client HTTPS funnels through that pool).
22+
When `SSL_CERT_FILE` is set (and the escape hatch below isn't), it
23+
builds the context via
24+
`ssl.create_default_context(cafile=SSL_CERT_FILE)`.
25+
- **The load-bearing detail: passing `cafile=` makes CPython skip
26+
`load_default_certs()`**, so the OS cert store is fully out of the
27+
loop — trust is the bundled certifi set only, on every platform.
28+
- `v2transport` reuses `app.net.sslcontext` rather than minting its own
29+
context (commit `ed79b46600`) — its old inline
30+
`create_default_context()` was a leftover from the private-CA `cadata`
31+
days, obsolete since basn nodes moved to public Let's Encrypt certs.
32+
33+
## Why: the Windows expired-legacy-root failure
34+
35+
Only win32 ever loaded the OS cert store — CPython's
36+
`load_default_certs()` enumerates the system store on Windows only, so
37+
mac/Linux/Android/iOS were already effectively certifi-only. The change
38+
brings Windows in line rather than taking anything away elsewhere.
39+
40+
The failure it prevents: expired legacy roots lingering in a user's
41+
Windows store (DST Root CA X3, the expired ISRG Root X2 cross-sign,
42+
stale R3/E1 intermediates) **poison OpenSSL chain-building**. OpenSSL
43+
anchors on the expired duplicate and rejects a currently-valid Let's
44+
Encrypt basn-node cert with `CERT_HAS_EXPIRED`, even though a valid
45+
ISRG X2 exists in certifi. Browsers (Chrome/Edge via CryptoAPI,
46+
Firefox via mozilla::pkix) do robust alternate-path chain building and
47+
don't trip on this; OpenSSL does not — so we feed it a clean store.
48+
49+
## Escape hatch
50+
51+
`BA_USE_SYSTEM_CERTS=1` reverts to a bare `create_default_context()`
52+
(OS store trust). This exists for corporate/AV TLS-inspection proxy
53+
environments whose MITM root lives only in the system store.
54+
55+
## Diagnostic signature and rule-outs
56+
57+
The characteristic symptom: WSS to `*.basn.ballistica.net` (Let's
58+
Encrypt cert) fails with `CERT_HAS_EXPIRED` while HTTPS to
59+
`regional.ballistica.net` (Amazon cert) succeeds — e.g. the game stuck
60+
in construct-mode. Rule-outs before blaming the OS store:
61+
62+
- **Not the clock** — the browser uses the same clock and works; a
63+
wrong clock also yields "not yet valid", not "expired".
64+
- **Not the server**`curl -sv https://prod-<id>.basn.ballistica.net/`
65+
shows `verify ok` with valid dates.
66+
- **Not stale bundled certifi** — verify it carries current ISRG
67+
X1/X2 and zero expired anchors.
68+
69+
Confirm the OS store on Windows with PowerShell:
70+
71+
```powershell
72+
Get-ChildItem Cert:\LocalMachine\Root,Cert:\CurrentUser\Root,Cert:\LocalMachine\CA,Cert:\CurrentUser\CA | ? {$_.NotAfter -lt (Get-Date)}
73+
```
74+
75+
Gotcha: **Firefox uses its own Mozilla/NSS store** and ignores the
76+
Windows store by default (enterprise-roots auto-import aside), so it's
77+
the wrong browser for testing an OS-store issue — use Edge or Chrome
78+
(CryptoAPI).
79+
80+
## Deferred alternative
81+
82+
A curated cross-platform trust set — certifi plus only the
83+
*non-expired* OS roots — was considered and deferred in favor of
84+
certifi-only simplicity/consistency. We don't bundle `cryptography`,
85+
so date-filtering OS roots would need `ssl.enum_certificates`
86+
(win-only) plus `_test_decode_cert` or a hand-rolled ASN.1 read.
87+
Revisit only if the corporate/AV MITM population ever proves to
88+
matter beyond what `BA_USE_SYSTEM_CERTS` covers.

pconfig/projectconfig.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"bauiv1lib": "buil"
2424
},
2525
"efrocache_repository_url": "https://files.ballistica.net/cache/ba1",
26-
"engine_build_number": 22966,
26+
"engine_build_number": 22967,
2727
"name": "BallisticaKit",
2828
"public": true,
2929
"python_paths": [
@@ -43,5 +43,5 @@
4343
"tests",
4444
"config"
4545
],
46-
"version": "1.8.0a74"
46+
"version": "1.8.0a75"
4747
}

0 commit comments

Comments
 (0)