diff --git a/.efrocachemap b/.efrocachemap index a7a574be..8e4e0f44 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -420,8 +420,8 @@ "assets/build/ba_data/audio/zoeOw.ogg": "https://files.ballistica.net/cache/ba1/60/ad/38269b7f1c7dc20cb9a506cd0681", "assets/build/ba_data/audio/zoePickup01.ogg": "https://files.ballistica.net/cache/ba1/72/85/d6fc4d16b7081d91fba2850b5b10", "assets/build/ba_data/audio/zoeScream01.ogg": "https://files.ballistica.net/cache/ba1/e9/ae/1d674d0c086eaa0bd1c3b1db0505", - "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/46/74/5bd691984b02c1fe036445eb5361", - "assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/b0/05/e530acaba539f040ce61e22561dc", + "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/82/b0/714f4683c01a746f516710612b6e", + "assets/build/ba_data/data/languages/arabic.json": "https://files.ballistica.net/cache/ba1/c5/81/e386a592e4fdf702b9089f106610", "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/d3/84/5e7df03070af059070ad1bd93cee", "assets/build/ba_data/data/languages/chinesetraditional.json": "https://files.ballistica.net/cache/ba1/c2/a4/993d5f0f30d0670d7053466929b6", @@ -432,29 +432,29 @@ "assets/build/ba_data/data/languages/english.json": "https://files.ballistica.net/cache/ba1/91/8c/67fb1ca2b8f256f133950b41ba2c", "assets/build/ba_data/data/languages/esperanto.json": "https://files.ballistica.net/cache/ba1/ac/f5/c0922a99e40dfc9f5e026d43b533", "assets/build/ba_data/data/languages/filipino.json": "https://files.ballistica.net/cache/ba1/86/26/060476f46994c035ae0d52640657", - "assets/build/ba_data/data/languages/french.json": "https://files.ballistica.net/cache/ba1/c7/cf/35a6ebc876c7476b72547a914d07", + "assets/build/ba_data/data/languages/french.json": "https://files.ballistica.net/cache/ba1/5d/2a/a5363cbe713fd67ea0baaa44403a", "assets/build/ba_data/data/languages/german.json": "https://files.ballistica.net/cache/ba1/06/58/071d6f7bbb5e93a3e074dbd323ae", "assets/build/ba_data/data/languages/gibberish.json": "https://files.ballistica.net/cache/ba1/45/e1/32cc8660b71d3d6b5fe1faff694d", - "assets/build/ba_data/data/languages/greek.json": "https://files.ballistica.net/cache/ba1/ae/89/47486b987d14f58b6cf2d665ce4b", + "assets/build/ba_data/data/languages/greek.json": "https://files.ballistica.net/cache/ba1/8a/82/392f2a4e0e6e5a5e367f19e49538", "assets/build/ba_data/data/languages/hindi.json": "https://files.ballistica.net/cache/ba1/9f/df/469e166c6a0d42bca4baae3a6cb6", "assets/build/ba_data/data/languages/hungarian.json": "https://files.ballistica.net/cache/ba1/b2/81/53c8cd7617d649403e539c3a6171", - "assets/build/ba_data/data/languages/indonesian.json": "https://files.ballistica.net/cache/ba1/18/36/799b6271fe8cb0e73b2eabb7f400", - "assets/build/ba_data/data/languages/italian.json": "https://files.ballistica.net/cache/ba1/5f/b2/b9301d67bef699a092a4c04dd522", + "assets/build/ba_data/data/languages/indonesian.json": "https://files.ballistica.net/cache/ba1/38/74/88d1ed374207750c9a834cddb809", + "assets/build/ba_data/data/languages/italian.json": "https://files.ballistica.net/cache/ba1/ce/09/20c87e343b41ec5dc43138ce071e", "assets/build/ba_data/data/languages/korean.json": "https://files.ballistica.net/cache/ba1/7c/38/d4a44c481757d355836f292ede48", - "assets/build/ba_data/data/languages/persian.json": "https://files.ballistica.net/cache/ba1/cd/ed/4d6d0778d256ccc0ff2e27b970c6", + "assets/build/ba_data/data/languages/persian.json": "https://files.ballistica.net/cache/ba1/db/14/2f441ccb65023775dc8139a63f3f", "assets/build/ba_data/data/languages/polish.json": "https://files.ballistica.net/cache/ba1/67/93/372c2a2428a830056e9ba22bbf95", - "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/c5/d4/f933bd3d80ded2b6ac2ea1af6eb2", + "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/03/14/6b767289325368be52e24ed3a58a", "assets/build/ba_data/data/languages/romanian.json": "https://files.ballistica.net/cache/ba1/d7/06/9d70642d0a4d1e3b1c2149d7a17c", - "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/6e/c3/df824198c6fe2da6ace053d30641", + "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/34/2d/9cc17dbd2858e04d0616d1c65ffb", "assets/build/ba_data/data/languages/serbian.json": "https://files.ballistica.net/cache/ba1/4e/91/6f2a9a3ce733908e91377a6ddb9a", "assets/build/ba_data/data/languages/slovak.json": "https://files.ballistica.net/cache/ba1/20/a9/163d189884edf802636bf291e432", - "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/6d/b7/dfc80f923378a408010cf4ee627a", + "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/29/1e/1c9666647b48f9c37d8559d22606", "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/2b/25/aa93983666b88d1c584f06b742b0", - "assets/build/ba_data/data/languages/thai.json": "https://files.ballistica.net/cache/ba1/f7/df/7ba5f99c5c2c4c86fc0503fcf0b7", - "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/b5/e8/606f6d3dc1f4bffc96128abaef03", - "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/1b/83/844f9e6f4e9e47a2d788d3faa9d2", - "assets/build/ba_data/data/languages/venetian.json": "https://files.ballistica.net/cache/ba1/17/15/973f4101bf2264173bd1c1729426", + "assets/build/ba_data/data/languages/tamil.json": "https://files.ballistica.net/cache/ba1/ec/b2/426ec5d0bb98145dc7123766fb5c", + "assets/build/ba_data/data/languages/thai.json": "https://files.ballistica.net/cache/ba1/d6/16/523c643358880b03b233ed88e557", + "assets/build/ba_data/data/languages/turkish.json": "https://files.ballistica.net/cache/ba1/52/5e/385f4d430fa82b2ac206277a71d4", + "assets/build/ba_data/data/languages/ukrainian.json": "https://files.ballistica.net/cache/ba1/73/7b/b8822b5632a8d3c7cf134e2859cc", + "assets/build/ba_data/data/languages/venetian.json": "https://files.ballistica.net/cache/ba1/a6/ed/416638d46950c9ab4f6155b9c334", "assets/build/ba_data/data/languages/vietnamese.json": "https://files.ballistica.net/cache/ba1/1f/ae/abe3f105b3c4b51f6b7942773305", "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", @@ -4003,50 +4003,50 @@ "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/1c/77/ac670a5118abdf8a7687af0e159b", "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/cf/52/f613c9b0d400e6a3cc46d1b10243", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/a2/a1/9bfcb44eed26b64ee45c10e71ebf", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e4/6a/b6828e87838c864910769e10b082", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/15/1b/4b88f866b595f9aee3589fe61f22", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/b3/bd/61195ab2b707b27ced0b88aab751", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/3f/5f/15a89a2c8aabd42d6fd990dcef61", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e1/a7/5c1fbf021cca742d3835b1b9ded8", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/1f/0d/b7ce6c28626235b46ed2f3b90d40", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/4d/67/34b91ed9e0236b4a5d5bfd72dfa9", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/bf/4a/e071a870261746f96a76f6dbb3c6", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/00/78/253923b1d2bd27fac67351eb06cd", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ba/8d/f11ab9ad9ebf7512c5b7d8b35a6f", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/38/bf/edf22880968b719327db7d8dd998", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/09/bf/758bd310a00cb749657149580e81", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9c/95/5b9f366fff40806b7ee2062f7050", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/24/a7/35eb9753ebaa9e41bc87e8f27dc3", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/ab/c6/1b1576f9d2f767815f7519353bd4", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/5a/d4/d2896f57e07ee1cbb43877c174cd", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/30/e9/d0dbf1bf4886264f9fc51b54e419", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/dc/62/a75c243384728a69acfb273e91f7", - "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1b/bc/4d8cc7c9807c8b7a02d67de95dba", - "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/10/e6/ccd40f2a83735c5da9193333cbf1", - "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/eb/3e/91f24852fb1766c9cf273e0952a6", - "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6f/64/c1cb80d0f007af1e7a7386281fc2", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/12/e5/ed36f54413a114c8d0762c2f57b1", - "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2c/8c/1597a2fe945c36e76c375fa5e412", - "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ce/28/61941473817cd934b21cc8447f4d", - "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/18/e3/01ee52c5bb52687324ecd3bb3f78", - "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3d/85/62176cf03dd0be0e11ec6ed56230", - "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/cf/62/7587a846e73295a7e12c66d0e19c", - "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ff/43/3ff93b30de352362dde3a173db18", - "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/5e/15/0279dbe76b979d494d69c03b0527", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/20/e6/7f97b816171100873578dfebc237", - "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/da/75/32d072333f57926ed2b649b01543", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/17/c2/e334283a230cfe50e5d4da8c02d4", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/c4/41/6a346833e2193a05b339d596f3dc", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/62/4a/87bc0017df139dbbc0195be774f5", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/fd/44/5db285cf7fd3301cd46f944dab6d", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/2f/09/dedf1229e5fa5ab73cea4b8b575b", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/c8/3e/7f3ce434876f2992a4043f398073", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/ed/a7/2088ab8e7e0ceb2ea768370bb464", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/03/51/0d6c5b45b326d2d7d069f8b371fc", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/77/fe/4f0d3a4ac3f71e4b214c5c5e4cc9", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/42/ef/e9b23bd9661675f6a9ec2bd7745d", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/02/50/7fd361fc7503bd6511dafe947737", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/cd/f1/fc3ad4cb576876298e3da037baed", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5d/f4/c7c37b0ed8386fc204d5321e0ab9", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a7/a8/4768f13ef21d2d3b384e806f06f6", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/63/38/bef42b4c6a1f742f0c9e63a9b16d", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/9c/f3/b3b46212ab0b146938a20990d800", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/1b/29/79f4ebdcb096ad83aaf752fb3701", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/02/f8/23419184457a183af712403a1352", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/b3/dc/892643ac9d8ec706229f866bbb6e", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/03/9e/8144ef6cd3db9fc5e71ee75371e5", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/f4/29/de145f02e7b8636995132c7b73b1", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d3/1e/f9ef9e2189ca84d24df7322ca220", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/10/dd/1e10c03dd72a683d8cd281f514d4", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/aa/91/e421baaab4757358888ad44828b9", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6d/84/c6675d46d85ebb2160c0de08d0c6", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/da/13/7bed9b02db2bd5983612694c5184", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/5d/c9/3e74ab03a580875a5cb032f7b0a2", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/ab/88/ca7e637cc7df91a9795ed4908446", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/26/3c/89b35d14dd9f6b703508d6bca998", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/2d/89/f67a14b5fc94c31767a2c9eb6d53", + "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a2/9d/285cd73953e62fdb7945c09fb83c", + "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/22/2d/3df4908dfdcdebe772bf3df0daee", + "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2a/74/763faee36da963364e94996429d5", + "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/87/9f/4408f47d293436f420ff9338dca6", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4f/e8/2518fd177b5c51f89ef0795b1264", + "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/77/b1/41befd66869830590f00bff7ba97", + "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/92/a2/8d6f01537d722803aab60cb67e6d", + "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/fc/be/0e1af48000395cdbe72179dba90a", + "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/20/7a/b31ec8c47d67b7fd23ed2510aae7", + "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a0/b5/b4ffd9769f3b703226e744423a58", + "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3b/02/9e8f15c68ca328a7549846d53a8f", + "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a0/74/b61b74ada26b41f421563b535dd0", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ec/5c/08c171db06bd4492a2b414c77488", + "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2f/8a/0384cc905ba23bd45afdfcacb882", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/63/6f/e6ba3560e0a8e404bb592405de27", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6e/14/c4f70a74e2111e3adb096dfbd215", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/64/34/4fb57218d72dd96ebd773d038b9e", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/e9/85/fce0278db5f65c6eebe538bc6e8a", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/e7/94/9a9303c4dcdc9f19aa6d14fde9b4", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/94/15/0f51426585729738fb6bcec10dcc", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/fe/db/eacb9929f586fa69c952eff0e710", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/ab/c8/478b908fbc91f09eee627c54b402", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/b8/69/26e9d56eb7379cb60e6d62c0922e", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/c9/b7/c083c6dbd82bf50b81ba2eb676e3", "src/ballistica/generated/python_embedded/binding.inc": "https://files.ballistica.net/cache/ba1/25/77/8093dfffddaa80cd513ddaa61867", "src/ballistica/generated/python_embedded/bootstrap.inc": "https://files.ballistica.net/cache/ba1/2d/4f/f4fe67827f36cd59cd5193333a02", "src/ballistica/generated/python_embedded/bootstrap_monolithic.inc": "https://files.ballistica.net/cache/ba1/ef/c1/aa5f1aa10af89f5c0b1e616355fd" diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml index 32534d60..ccea1e37 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -679,6 +679,7 @@ dosomething dostar dostuff + downcasting downmix dpad dpath diff --git a/CHANGELOG.md b/CHANGELOG.md index 23388791..4bf94ffa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ -### 1.7.14 (build 20956, api 7, 2022-12-01) +### 1.7.16 (build 20963, api 7, 2022-12-08) +- Fixed a bug where profile names encased in curly brackets could cause harmless error messages. +- Android will no longer log errors on ba.open_url() calls if a browser is not available (it still just falls back to the in-app dialog in that case). +- The 'Upgrade' button for device accounts now signs you out and closes the upgrade window to hopefully make it more clear that you need to sign in with your newly created/upgraded BombSquad account. +- Fixed a bug where the remote app could not connect for the first 5 seconds after launching the app. + +### 1.7.15 (build 20960, api 7, 2022-12-04) +- The cancel button on the 'Sign in with a Bombsquad Account' popup no longer respond to system cancel buttons (escape key, android back button, etc). Turns out some Android people were pressing back repeatedly to come back from a browser after signing in and immediately canceling their sign in attempts in the game before they completed. Hopefully this will avoid some frustration. +- Fixed an issue where back presses could result in multiple main menu windows appearing. + +### 1.7.14 (build 20958, api 7, 2022-12-03) - Android Google Play logins now provide V2 accounts with access to all V2 features such as a globally-unique account tag, cloud-console, and workspaces. They should still retain their V1 data as well. - V2 accounts now have a 'Manage Account' button in the app account window which will sign you into a browser with your current account. - Removed Google App Invite functionality which has been deprecated for a while now. Google Play users can still get tickets by sharing the app via codes (same as other platforms). @@ -13,6 +23,7 @@ - Fixed a low level event-loop issue that in some cases was preventing the Android version from properly pausing/resuming the app or managing connections while in the background. If you look at the devices section on ballistica.net you should now see your device disappear when you background the app and reappear when you foreground it. Please holler if not. - Device accounts are now marked as deprecated, and signing in with one now brings up an 'upgrade' UI which allows converting it to a V2 account. It is my hope to push the entire client ecosystem to V2 accounts as quickly as possible since trying to support both independent V1 accounts and V2 accounts is a substantial technical burden. - Fixed an issue where Log calls made within `Thread::PushThreadMessage()` could result in deadlock. +- Fixed an issue where some Android hardware buttons could theoretically cause rogue game controller button presses (due to downcasting int values > 255 into a uint8 value). ### 1.7.13 (build 20919, api 7, 2022-11-03) - Android target-sdk has been updated to 33 (Android 13). Please holler if anything seems broken or is behaving differently than before on Android. diff --git a/assets/src/ba_data/python/ba/_bootstrap.py b/assets/src/ba_data/python/ba/_bootstrap.py index 9d058ae7..0f5821ec 100644 --- a/assets/src/ba_data/python/ba/_bootstrap.py +++ b/assets/src/ba_data/python/ba/_bootstrap.py @@ -47,7 +47,7 @@ def bootstrap() -> None: # Give a soft warning if we're being used with a different binary # version than we expect. - expected_build = 20956 + expected_build = 20963 running_build: int = env['build_number'] if running_build != expected_build: print( diff --git a/assets/src/ba_data/python/ba/_plugin.py b/assets/src/ba_data/python/ba/_plugin.py index a9a50172..2aad94b1 100644 --- a/assets/src/ba_data/python/ba/_plugin.py +++ b/assets/src/ba_data/python/ba/_plugin.py @@ -174,7 +174,7 @@ class PluginSubsystem: color=(1, 1, 0), ) plugnames = ', '.join(disappeared_plugs) - logging.warning( + logging.info( '%d plugin(s) no longer found: %s.', len(disappeared_plugs), plugnames, diff --git a/assets/src/ba_data/python/bastd/ui/account/v2proxy.py b/assets/src/ba_data/python/bastd/ui/account/v2proxy.py index a2d4fb76..d782fcf7 100644 --- a/assets/src/ba_data/python/bastd/ui/account/v2proxy.py +++ b/assets/src/ba_data/python/bastd/ui/account/v2proxy.py @@ -67,11 +67,14 @@ class V2ProxySignInWindow(ba.Window): label=ba.Lstr(resource='cancelText'), on_activate_call=self._done, autoselect=True, + color=(0.55, 0.5, 0.6), textcolor=(0.75, 0.7, 0.8), ) - ba.containerwidget( - edit=self._root_widget, cancel_button=self._cancel_button - ) + + if bool(False): + ba.containerwidget( + edit=self._root_widget, cancel_button=self._cancel_button + ) self._update_timer: ba.Timer | None = None diff --git a/assets/src/ba_data/python/bastd/ui/v2upgrade.py b/assets/src/ba_data/python/bastd/ui/v2upgrade.py index ed61e170..7210c95e 100644 --- a/assets/src/ba_data/python/bastd/ui/v2upgrade.py +++ b/assets/src/ba_data/python/bastd/ui/v2upgrade.py @@ -88,17 +88,13 @@ class V2UpgradeWindow(ba.Window): on_activate_call=show_what_is_v2_page, ) - bamasteraddr = ba.internal.get_master_server_address(version=2) upgrade_button = ba.buttonwidget( parent=self._root_widget, position=(self._width - button_width - 20, 25), size=(button_width, 65), autoselect=True, label=ba.Lstr(resource='upgradeText'), - on_activate_call=ba.Call( - ba.open_url, - f'{bamasteraddr}/v2uda/{self._code}', - ), + on_activate_call=self._upgrade_press, ) ba.containerwidget( @@ -107,5 +103,15 @@ class V2UpgradeWindow(ba.Window): cancel_button=cancel_button, ) + def _upgrade_press(self) -> None: + # Get rid of the window and sign out before kicking the + # user over to a browser to do the upgrade. This hopefully + # makes it more clear when they come back that they need to + # sign in with the 'BombSquad account' option. + ba.containerwidget(edit=self._root_widget, transition='out_left') + ba.internal.sign_out_v1() + bamasteraddr = ba.internal.get_master_server_address(version=2) + ba.open_url(f'{bamasteraddr}/v2uda/{self._code}') + def _done(self) -> None: ba.containerwidget(edit=self._root_widget, transition='out_left') diff --git a/ballisticacore-cmake/.idea/dictionaries/ericf.xml b/ballisticacore-cmake/.idea/dictionaries/ericf.xml index de0fbb15..d584d5dc 100644 --- a/ballisticacore-cmake/.idea/dictionaries/ericf.xml +++ b/ballisticacore-cmake/.idea/dictionaries/ericf.xml @@ -369,6 +369,7 @@ doraise dosomething dout + downcasting downsample dpad dpads diff --git a/src/ballistica/app/app_flavor.cc b/src/ballistica/app/app_flavor.cc index d6a2b1ed..0d237d87 100644 --- a/src/ballistica/app/app_flavor.cc +++ b/src/ballistica/app/app_flavor.cc @@ -257,10 +257,13 @@ void AppFlavor::PauseApp() { auto threads{Thread::GetStillPausingThreads()}; running_thread_count = threads.size(); if (running_thread_count == 0) { - Log(LogLevel::kDebug, - "PauseApp() completed in " - + std::to_string(Platform::GetCurrentMilliseconds() - start_time) - + "ms."); + if (g_buildconfig.debug_build()) { + Log(LogLevel::kDebug, + "PauseApp() completed in " + + std::to_string(Platform::GetCurrentMilliseconds() + - start_time) + + "ms."); + } return; } } @@ -282,10 +285,12 @@ void AppFlavor::ResumeApp() { assert(sys_paused_app_); sys_paused_app_ = false; UpdatePauseResume(); - Log(LogLevel::kDebug, - "ResumeApp() completed in " - + std::to_string(Platform::GetCurrentMilliseconds() - start_time) - + "ms."); + if (g_buildconfig.debug_build()) { + Log(LogLevel::kDebug, + "ResumeApp() completed in " + + std::to_string(Platform::GetCurrentMilliseconds() - start_time) + + "ms."); + } } void AppFlavor::DidFinishRenderingFrame(FrameDef* frame) {} diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index 7e901c60..6455dac7 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -32,8 +32,8 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20956; -const char* kAppVersion = "1.7.14"; +const int kAppBuildNumber = 20963; +const char* kAppVersion = "1.7.16"; // Our standalone globals. // These are separated out for easy access. diff --git a/src/ballistica/input/remote_app.cc b/src/ballistica/input/remote_app.cc index 43c3549a..09320c24 100644 --- a/src/ballistica/input/remote_app.cc +++ b/src/ballistica/input/remote_app.cc @@ -377,12 +377,14 @@ auto RemoteAppServer::GetClient(int request_id, struct sockaddr* addr, } } - // Don't reuse a slot for 5 seconds. + // Don't reuse a slot for 5 seconds (if its been heard from since this time). millisecs_t cooldown_time = GetRealTime() - 5000; // Ok, not there already.. now look for a non-taken one and return that. for (int i = 0; i < kMaxRemoteAppClients; i++) { - if (!clients_[i].in_use && clients_[i].last_contact_time < cooldown_time) { + if (!clients_[i].in_use + && (clients_[i].last_contact_time == 0 + || clients_[i].last_contact_time < cooldown_time)) { // Ok lets fill out the client. clients_[i].in_use = true; clients_[i].next_state_id = 0; diff --git a/src/ballistica/ui/widget/root_widget.cc b/src/ballistica/ui/widget/root_widget.cc index 976dd8e8..c9028fc9 100644 --- a/src/ballistica/ui/widget/root_widget.cc +++ b/src/ballistica/ui/widget/root_widget.cc @@ -1108,7 +1108,15 @@ void RootWidget::SetOverlayWidget(StackWidget* w) { overlay_stack_widget_ = w; } -void RootWidget::OnCancelCustom() { g_ui->PushBackButtonCall(nullptr); } +void RootWidget::OnCancelCustom() { + // Need to revisit this. If the cancel event it pushes is not handled, it will + // wind up back here where it pushes another back call. This cycle repeats + // forever until something comes along which does handle cancel events and + // then it gets them all. Current repro case is Sign-in-with-BombSquad-Account + // window - press escape a few times while that is up and then click cancel; + // This code is only used for toolbar mode so should be safe to leave it + // disabled for now. g_ui->PushBackButtonCall(nullptr); +} auto RootWidget::GetSpecialWidget(const std::string& s) const -> Widget* { if (s == "party_button") { diff --git a/src/ballistica/ui/widget/text_widget.cc b/src/ballistica/ui/widget/text_widget.cc index c45241e9..ab40826d 100644 --- a/src/ballistica/ui/widget/text_widget.cc +++ b/src/ballistica/ui/widget/text_widget.cc @@ -441,20 +441,23 @@ void TextWidget::SetText(const std::string& text_in_raw) { bool do_format_check{}; bool print_false_positives{}; - if (g_buildconfig.debug_build()) { - do_format_check = explicit_bool(true); - } else { - if (text_in_raw.size() > 1 && text_in_raw[0] == '{' - && text_in_raw[text_in_raw.size() - 1] == '}') { - // Ok, its got bounds like json; now if its either missing quotes or a - // colon then let's check it. - if (!strstr(text_in_raw.c_str(), "\"") - || !strstr(text_in_raw.c_str(), ":")) { - do_format_check = true; + // Only non-editable text support resource-strings. + if (!editable_) { + if (g_buildconfig.debug_build()) { + do_format_check = explicit_bool(true); + } else { + if (text_in_raw.size() > 1 && text_in_raw[0] == '{' + && text_in_raw[text_in_raw.size() - 1] == '}') { + // Ok, its got bounds like json; now if its either missing quotes or a + // colon then let's check it. + if (!strstr(text_in_raw.c_str(), "\"") + || !strstr(text_in_raw.c_str(), ":")) { + do_format_check = true; - // We wanna avoid doing this check when we don't have to. - // so lets print if we get a false positive - print_false_positives = true; + // We wanna avoid doing this check when we don't have to. + // so lets print if we get a false positive + print_false_positives = true; + } } } } diff --git a/tools/efro/dataclassio/_base.py b/tools/efro/dataclassio/_base.py index 134ea001..0402488b 100644 --- a/tools/efro/dataclassio/_base.py +++ b/tools/efro/dataclassio/_base.py @@ -111,6 +111,8 @@ class IOAttrs: boundaries (see efro.util.utc_today()). 'whole_hours', if True, requires datetime values to lie exactly on hour boundaries (see efro.util.utc_this_hour()). + 'whole_minutes', if True, requires datetime values to lie exactly on minute + boundaries (see efro.util.utc_this_minute()). 'soft_default', if passed, injects a default value into dataclass instantiation when the field is not present in the input data. This allows dataclasses to add new non-optional fields while @@ -136,6 +138,7 @@ class IOAttrs: store_default: bool = True whole_days: bool = False whole_hours: bool = False + whole_minutes: bool = False soft_default: Any = MISSING soft_default_factory: Callable[[], Any] | _MissingType = MISSING @@ -145,6 +148,7 @@ class IOAttrs: store_default: bool = store_default, whole_days: bool = whole_days, whole_hours: bool = whole_hours, + whole_minutes: bool = whole_minutes, soft_default: Any = MISSING, soft_default_factory: Callable[[], Any] | _MissingType = MISSING, ): @@ -160,6 +164,8 @@ class IOAttrs: self.whole_days = whole_days if whole_hours != cls.whole_hours: self.whole_hours = whole_hours + if whole_minutes != cls.whole_minutes: + self.whole_minutes = whole_minutes if soft_default is not cls.soft_default: # Do what dataclasses does with its default types and @@ -216,13 +222,18 @@ class IOAttrs: raise ValueError( f'Value {value} at {fieldpath} is not a whole day.' ) - if self.whole_hours: + elif self.whole_hours: if any( x != 0 for x in (value.minute, value.second, value.microsecond) ): raise ValueError( f'Value {value} at {fieldpath}' f' is not a whole hour.' ) + elif self.whole_minutes: + if any(x != 0 for x in (value.second, value.microsecond)): + raise ValueError( + f'Value {value} at {fieldpath}' f' is not a whole minute.' + ) def _get_origin(anntype: Any) -> Any: diff --git a/tools/efrotools/ios.py b/tools/efrotools/ios.py index 4b2bfd3f..db724320 100644 --- a/tools/efrotools/ios.py +++ b/tools/efrotools/ios.py @@ -134,6 +134,7 @@ def _add_build_to_xcarchive( MODES['debug']['configuration'], '-archivePath', str(archivepathbase), + '-allowProvisioningUpdates', ] subprocess.run(args, check=True, capture_output=False)