diff --git a/.efrocachemap b/.efrocachemap index 1f4b457e..19cce70e 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -420,40 +420,40 @@ "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/f0/2d/dbe45794f17260f2961831c88a36", + "assets/build/ba_data/data/langdata.json": "https://files.ballistica.net/cache/ba1/3c/3f/dc185a4ea8f2512770558ce0ff90", "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/chinese.json": "https://files.ballistica.net/cache/ba1/8e/4f/992f2a50dbe9514d774c1bb4fd28", "assets/build/ba_data/data/languages/chinesetraditional.json": "https://files.ballistica.net/cache/ba1/c2/a4/993d5f0f30d0670d7053466929b6", "assets/build/ba_data/data/languages/croatian.json": "https://files.ballistica.net/cache/ba1/c9/73/01a1343af814131b1ee96af0b687", "assets/build/ba_data/data/languages/czech.json": "https://files.ballistica.net/cache/ba1/cb/df/f2d54d3146a159c678a47d3ff01b", "assets/build/ba_data/data/languages/danish.json": "https://files.ballistica.net/cache/ba1/6a/fa/fcf4a804beaff927b0f12c179eaa", "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/1f/55/bd97a0f23f4deba2a72ad9ab549e", + "assets/build/ba_data/data/languages/english.json": "https://files.ballistica.net/cache/ba1/7e/e7/836562182c2056902a326f5c7b9d", "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/22/5e/6ef2e291465bfb12998f0e23616a", + "assets/build/ba_data/data/languages/filipino.json": "https://files.ballistica.net/cache/ba1/65/3f/6f1b739feac015dc39e97675b49d", "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/58/40/5315a0f4ebbd58c6cb3390907f9a", - "assets/build/ba_data/data/languages/gibberish.json": "https://files.ballistica.net/cache/ba1/d5/65/40add8ed982fb1abb8f120651a1d", + "assets/build/ba_data/data/languages/german.json": "https://files.ballistica.net/cache/ba1/27/48/4cf2f4a3dd35260ef9b3b188ccde", + "assets/build/ba_data/data/languages/gibberish.json": "https://files.ballistica.net/cache/ba1/63/64/8073ab02f55940292099513d341b", "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/2e/d1/b506ddf3d27af7be1ae6159531a3", "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/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/indonesian.json": "https://files.ballistica.net/cache/ba1/b4/51/0f993429723480691d5289c7bc5d", + "assets/build/ba_data/data/languages/italian.json": "https://files.ballistica.net/cache/ba1/72/35/c40aee4c2f7f64fa030f83eb08d5", "assets/build/ba_data/data/languages/korean.json": "https://files.ballistica.net/cache/ba1/7c/38/d4a44c481757d355836f292ede48", "assets/build/ba_data/data/languages/malay.json": "https://files.ballistica.net/cache/ba1/66/32/92ae734c4358397d2e90c1c85325", "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/03/14/6b767289325368be52e24ed3a58a", + "assets/build/ba_data/data/languages/portuguese.json": "https://files.ballistica.net/cache/ba1/e6/fb/dfef0975c9c58cbcc621c022ec4b", "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/34/2d/9cc17dbd2858e04d0616d1c65ffb", + "assets/build/ba_data/data/languages/russian.json": "https://files.ballistica.net/cache/ba1/a4/08/5e70701b63899cddf21733b0eea6", "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/29/1e/1c9666647b48f9c37d8559d22606", + "assets/build/ba_data/data/languages/spanish.json": "https://files.ballistica.net/cache/ba1/e9/6d/62090311ae9aabaaae3918ea2d5b", "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/ec/b2/426ec5d0bb98145dc7123766fb5c", + "assets/build/ba_data/data/languages/tamil.json": "https://files.ballistica.net/cache/ba1/48/2c/78cb542498a59e3023b4838df515", "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/turkish.json": "https://files.ballistica.net/cache/ba1/c3/d2/d075ad07ec8d8aec3616f8760534", "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", @@ -1859,6 +1859,10 @@ "assets/build/ba_data/textures/menuIcon.ktx": "https://files.ballistica.net/cache/ba1/e7/8c/dde40b132e096841299505e2b665", "assets/build/ba_data/textures/menuIcon.pvr": "https://files.ballistica.net/cache/ba1/91/d3/6e3b38a70caa2bc68ddff50e3421", "assets/build/ba_data/textures/menuIcon_preview.png": "https://files.ballistica.net/cache/ba1/1f/22/69a013729949501405ea342a1a8b", + "assets/build/ba_data/textures/merch.dds": "https://files.ballistica.net/cache/ba1/da/6a/87779603f295cf30fcec2d3a4e9f", + "assets/build/ba_data/textures/merch.ktx": "https://files.ballistica.net/cache/ba1/5b/c4/2df30594a9e7c1988d92435d7bd0", + "assets/build/ba_data/textures/merch.pvr": "https://files.ballistica.net/cache/ba1/20/76/b8da7a2dded8c137c8388bcb6986", + "assets/build/ba_data/textures/merch_preview.png": "https://files.ballistica.net/cache/ba1/31/ad/9ffc829f1fcff718106d129ac062", "assets/build/ba_data/textures/meter.dds": "https://files.ballistica.net/cache/ba1/52/a8/00244236f0e6126e2e14bd1f3106", "assets/build/ba_data/textures/meter.ktx": "https://files.ballistica.net/cache/ba1/b5/e7/3ba3d4c7c7e05081eb033ae5da8f", "assets/build/ba_data/textures/meter.pvr": "https://files.ballistica.net/cache/ba1/58/de/ab83ad9e0d9b434ca42811030ef9", @@ -4004,50 +4008,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/1c/91/7ae1b68a23982fea887522f1c190", - "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/0a/85/df9814b9bf896f4abea28768e92b", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/b4/a1/7f03feb7a85d24245f1f6684032e", - "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/9c/6a/8653f666ea158628c486ea54e4e2", - "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/d6/e2/ca77c216625adc6b4e8af0d388b1", - "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/d4/bb/a88afebc39bf026b31abaf08d9d4", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/01/a0/1a3b24b2a41563594b26eb4fb948", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/74/57/115e41be4d58896035abf97ce344", - "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/73/16/fc91ce4346f1f47f6f2ca7851c74", - "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/29/d5/b4104b2bdcd5313599442f67422b", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ec/73/9d05a319bcc76428d29e3449b9cc", - "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ea/f7/f86d1d668e67254333b774b2d8c1", - "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f7/75/ee906782bf6cda84349bd2a12ede", - "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/50/0b/f57762d8bb07d039441f6f4d05c2", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a2/17/d025c0947448310b4efbf6553bca", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c0/a7/febd382d01d7a6671f50b45cf7b7", - "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/36/6b/6a1baa6b91487ab4f156a720e875", - "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/ff/e7/63d4866736010ebeb01ded394cac", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/72/6a/d6e87def1a6e663f0eed36a05779", - "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/09/ac/34a441b000c510d46c4fda7036fb", - "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/1b/47/d6384f65f8b4a3fc1c63c69a1c8c", - "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b6/4c/14bc1088021461969748f0555d64", - "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ef/08/deb368b8fa5f12eaadc63b1388dc", - "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/30/78/1069cc823a81fad93339bc791a11", - "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e3/9f/2fd0cdf791782b9cf887fdee5eee", - "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d2/24/459b6854f0a8fae959b9ff37ed4c", - "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ce/27/104a5dca1fa570cd41faedf6973e", - "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/1c/259af37062fb8fe2a50bcaad8c1a", - "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7b/63/2430e689d0e1980c3f40d113db6e", - "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/34/a7/484b831c51c83c692e8c59dcd11c", - "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8b/ce/8136e2adf01ee38b1d419553464f", - "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0d/90/2c695a05575e73c42969917f2d3a", - "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/d2/fd/ceb1eb357d0b36852d88899356e8", - "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/09/15/a8daaff2ebe63f85987937692152", - "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/23/f9/ab5c5f9b0bb754034881ab82afe5", - "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/34/16/dbc9386010f6074dc548a081e7cd", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/b7/06/ce8858ccf49e1ccdb71e15d25ead", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/b2/25/2203b80ba9adea38dbb152bc665e", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/4a/29/908997a9aa377f2a13053e591c16", - "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/27/c9/46e170eb44a7cccb92cfd6b382a2", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/6c/29/06e3a7db44446f381ffcf4f79c99", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/02/9b/66ce0f85f69e71549b2aab5b4fca", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/23/7d/15c3fe7a60284323da4d4f199845", - "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/32/e5/faff7cbc87f94743f2176bd7efef", + "build/prefab/full/linux_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/6f/3c/b6d4e92dcbac32aa3093d9139b9d", + "build/prefab/full/linux_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/a1/b8/31ad72ffe5df6bbedbd59eb3f02b", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d2/d9/084996631fa94337e0a92c93b753", + "build/prefab/full/linux_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/89/0a/4483e91a808e4724dfbc382d6f60", + "build/prefab/full/linux_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/ec/4d/6c58d9a9c5b13837d87d3d871868", + "build/prefab/full/linux_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/dd/12/2e3164bd4770a6c648e2e7dbc4f0", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fa/41/63a57ecf884cecf7ee1c8b9b2dcf", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/64/2b/0ebcdfd2f61027dcfff899d8894f", + "build/prefab/full/mac_arm64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/8f/e7/3ca7ed13d4a03013ecbb80ecb78c", + "build/prefab/full/mac_arm64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ec/e2/ebe20cc007e87d0ede6e0ec169af", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3a/77/32299795fdb8b0c0fbc3130b7193", + "build/prefab/full/mac_arm64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c2/1a/bfaeccd961429479947ea1cb2c47", + "build/prefab/full/mac_x86_64_gui/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/43/74/b5749a746e72007f2f464b2941c6", + "build/prefab/full/mac_x86_64_gui/release/ballisticacore": "https://files.ballistica.net/cache/ba1/eb/e2/f97727387a3f9707b079b7b2acd0", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/5f/da/6a048012e6b94a303e59b8dae61b", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/f5/11/e75118e0a8f821e030f82e79c1bc", + "build/prefab/full/windows_x86_gui/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/d2/ad/4ee541d9d19b2d6fc1dab4947a26", + "build/prefab/full/windows_x86_gui/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/10/2b/133d1cf611800e518d5353a10a94", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/85/53/fde7e925ac80da650a02ee078ad0", + "build/prefab/full/windows_x86_server/release/dist/BallisticaCoreHeadless.exe": "https://files.ballistica.net/cache/ba1/96/8e/c8292f6fc6967003affeb6ca32b7", + "build/prefab/lib/linux_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/28/f6/26327365481296a963bb37d58d82", + "build/prefab/lib/linux_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6d/b6/4e4a46d553d1949c956e72a3617d", + "build/prefab/lib/linux_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/81/57/d0a2b72a86d6f7f542d07e4fba29", + "build/prefab/lib/linux_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ac/f5/a6350f397911c2833c35fb86aa6c", + "build/prefab/lib/linux_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/91/87/78eab8de6f5bc52ff10f75e9d0b5", + "build/prefab/lib/linux_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a9/29/9cf3b260aae600ccafb535309b62", + "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/56/c2/75943b307817b0f23807b4f36632", + "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/51/6cf630d6ab82f8946569b96f01b5", + "build/prefab/lib/mac_arm64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e4/ba/31a54b98463bc261835ac9cc7c51", + "build/prefab/lib/mac_arm64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/64/25/bba77bfd767e14a9df46795c93bb", + "build/prefab/lib/mac_arm64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/f2/17/02a1053141eac72b24c323b10003", + "build/prefab/lib/mac_arm64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/98/ca/dcbb87a7c32120a42ab6ca1e7194", + "build/prefab/lib/mac_x86_64_gui/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/ca/dc/4a0fcdee7fc3c57960d5381a0299", + "build/prefab/lib/mac_x86_64_gui/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/6c/a3/b70ad508a305efc2a10b5ba4508e", + "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/98/a9/1426b7eadc8be33f98f103fb12f0", + "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/38/8f/50753e457af4c626e2285c3171ac", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/fe/4d/77331e69f4fc0ef288df17377b42", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/9b/07/37e3a24a6ee588d0e5d4ba7b5335", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/0a/60/0109e5badaf8d6610cc9a4a61aa2", + "build/prefab/lib/windows/Debug_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/6d/e7/4e5bf2f3c16ca59770d5789c2481", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.lib": "https://files.ballistica.net/cache/ba1/b5/de/6914b0c6ab3142ad99547e930d88", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreGenericInternal.pdb": "https://files.ballistica.net/cache/ba1/3e/a4/e22b4cc12099dc6863a418d186f9", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.lib": "https://files.ballistica.net/cache/ba1/bd/c7/c97d29a73c75b3e699f14bcd6e37", + "build/prefab/lib/windows/Release_Win32/BallisticaCoreHeadlessInternal.pdb": "https://files.ballistica.net/cache/ba1/44/36/de0a2f89ccd4e4728301cecd1033", "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 ccea1e37..780866a1 100644 --- a/.idea/dictionaries/ericf.xml +++ b/.idea/dictionaries/ericf.xml @@ -851,6 +851,7 @@ fakeshake fallbacks farthestpt + faulthandler fback fbase fclose @@ -1525,6 +1526,7 @@ masterhash masterver mastervers + matchlines mathmodule mathnode mathutils @@ -2857,6 +2859,7 @@ wanttype warntype wasdead + wasn wavenum weakref weakrefs diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d6d6d87..a99f4fac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.16 (build 20966, api 7, 2022-12-15) +### 1.7.16 (build 20967, api 7, 2022-12-16) - 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. @@ -6,6 +6,8 @@ - Added Malay language. Ick; apparently its been sitting done for a while and I hadn't realized it wasn't added to the game yet. Apologies!. And thanks to all contributors! - Added 'enable_queue' server config setting. This defaults to True but can be turned off as a workaround for server owners targeted by queue spam attacks. - The public party list no longer sorts servers without queues at the end of the list. This sorting was put there long ago to prioritize fancy new queue-supporting servers but now it would just make the few that opt out of queues hard to find. Doh. So opting out of queues is probably not a great idea until this build is widespread. +- Public uuids now only change once every 6 months or so instead of with every version bump. This way periods of heavy development won't put added strain on server owners trying to keep ban lists up to date and whatnot. +- Added a merch button in the in-game store that goes to the ballistica.net merch page (though it only shows up in the few countries where merch is available). ### 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. diff --git a/assets/.asset_manifest_private.json b/assets/.asset_manifest_private.json index 9fd06197..6b62d1ec 100644 --- a/assets/.asset_manifest_private.json +++ b/assets/.asset_manifest_private.json @@ -1881,6 +1881,10 @@ "ba_data/textures/menuIcon.ktx", "ba_data/textures/menuIcon.pvr", "ba_data/textures/menuIcon_preview.png", + "ba_data/textures/merch.dds", + "ba_data/textures/merch.ktx", + "ba_data/textures/merch.pvr", + "ba_data/textures/merch_preview.png", "ba_data/textures/meter.dds", "ba_data/textures/meter.ktx", "ba_data/textures/meter.pvr", diff --git a/assets/Makefile b/assets/Makefile index 6734f2fb..2776b045 100644 --- a/assets/Makefile +++ b/assets/Makefile @@ -5598,6 +5598,7 @@ TEX2D_DDS_TARGETS = \ build/ba_data/textures/menuBG.dds \ build/ba_data/textures/menuButton.dds \ build/ba_data/textures/menuIcon.dds \ + build/ba_data/textures/merch.dds \ build/ba_data/textures/meter.dds \ build/ba_data/textures/monkeyFaceLevelColor.dds \ build/ba_data/textures/monkeyFacePreview.dds \ @@ -6003,6 +6004,7 @@ TEX2D_PVR_TARGETS = \ build/ba_data/textures/menuBG.pvr \ build/ba_data/textures/menuButton.pvr \ build/ba_data/textures/menuIcon.pvr \ + build/ba_data/textures/merch.pvr \ build/ba_data/textures/meter.pvr \ build/ba_data/textures/monkeyFaceLevelColor.pvr \ build/ba_data/textures/monkeyFacePreview.pvr \ @@ -6408,6 +6410,7 @@ TEX2D_KTX_TARGETS = \ build/ba_data/textures/menuBG.ktx \ build/ba_data/textures/menuButton.ktx \ build/ba_data/textures/menuIcon.ktx \ + build/ba_data/textures/merch.ktx \ build/ba_data/textures/meter.ktx \ build/ba_data/textures/monkeyFaceLevelColor.ktx \ build/ba_data/textures/monkeyFacePreview.ktx \ @@ -6813,6 +6816,7 @@ TEX2D_PREVIEW_PNG_TARGETS = \ build/ba_data/textures/menuBG_preview.png \ build/ba_data/textures/menuButton_preview.png \ build/ba_data/textures/menuIcon_preview.png \ + build/ba_data/textures/merch_preview.png \ build/ba_data/textures/meter_preview.png \ build/ba_data/textures/monkeyFaceLevelColor_preview.png \ build/ba_data/textures/monkeyFacePreview_preview.png \ diff --git a/assets/src/ba_data/python/ba/_bootstrap.py b/assets/src/ba_data/python/ba/_bootstrap.py index 882de6c2..53091f8f 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 = 20966 + expected_build = 20967 running_build: int = env['build_number'] if running_build != expected_build: print( diff --git a/assets/src/ba_data/python/ba/_cloud.py b/assets/src/ba_data/python/ba/_cloud.py index 785e68c7..e9ead0b4 100644 --- a/assets/src/ba_data/python/ba/_cloud.py +++ b/assets/src/ba_data/python/ba/_cloud.py @@ -131,6 +131,12 @@ class CloudSubsystem: ) -> bacommon.cloud.WorkspaceFetchResponse: ... + @overload + def send_message( + self, msg: bacommon.cloud.MerchAvailabilityMessage + ) -> bacommon.cloud.MerchAvailabilityResponse: + ... + @overload def send_message( self, msg: bacommon.cloud.TestMessage diff --git a/assets/src/ba_data/python/ba/_store.py b/assets/src/ba_data/python/ba/_store.py index 850a0aa0..2dfc07c1 100644 --- a/assets/src/ba_data/python/ba/_store.py +++ b/assets/src/ba_data/python/ba/_store.py @@ -30,6 +30,8 @@ def get_store_item_name_translated(item_name: str) -> ba.Lstr: return _language.Lstr( translate=('characterNames', item_info['character']) ) + if item_name in ['merch']: + return _language.Lstr(resource='merchText') if item_name in ['upgrades.pro', 'pro']: return _language.Lstr( resource='store.bombSquadProNameText', @@ -50,7 +52,7 @@ def get_store_item_display_size(item_name: str) -> tuple[float, float]: """(internal)""" if item_name.startswith('characters.'): return 340 * 0.6, 430 * 0.6 - if item_name in ['pro', 'upgrades.pro']: + if item_name in ['pro', 'upgrades.pro', 'merch']: return 650 * 0.9, 500 * 0.85 if item_name.startswith('maps.'): return 510 * 0.6, 450 * 0.6 @@ -96,6 +98,7 @@ def get_store_items() -> dict[str, dict]: 'characters.taobaomascot': {'character': 'Taobao Mascot'}, 'characters.santa': {'character': 'Santa Claus'}, 'characters.bunny': {'character': 'Easter Bunny'}, + 'merch': {}, 'pro': {}, 'maps.lake_frigid': {'map_type': maps.LakeFrigid}, 'games.ninja_fight': { @@ -193,9 +196,7 @@ def get_store_items() -> dict[str, dict]: 'icons.fireball': {'icon': _ba.charstr(SpecialChar.FIREBALL)}, 'icons.mikirog': {'icon': _ba.charstr(SpecialChar.MIKIROG)}, } - store_items = _ba.app.store_items - assert store_items is not None - return store_items + return _ba.app.store_items def get_store_layout() -> dict[str, list[dict[str, Any]]]: @@ -261,7 +262,6 @@ def get_store_layout() -> dict[str, list[dict[str, Any]]]: ], } store_layout = _ba.app.store_layout - assert store_layout is not None store_layout['characters'] = [ { 'items': [ @@ -302,6 +302,12 @@ def get_store_layout() -> dict[str, list[dict[str, Any]]]: 'items': ['games.easter_egg_hunt'], } ) + + # This will cause merch to show only if the master-server has + # given us a link (which means merch is available in our region). + store_layout['extras'] = [{'items': ['pro']}] + if _ba.app.config.get('Merch Link'): + store_layout['extras'][0]['items'].append('merch') return store_layout diff --git a/assets/src/ba_data/python/bastd/ui/store/browser.py b/assets/src/ba_data/python/bastd/ui/store/browser.py index 49a301c2..3582629f 100644 --- a/assets/src/ba_data/python/bastd/ui/store/browser.py +++ b/assets/src/ba_data/python/bastd/ui/store/browser.py @@ -4,18 +4,25 @@ # pylint: disable=too-many-lines from __future__ import annotations +import time import copy import math +import logging import weakref from enum import Enum +from threading import Thread from typing import TYPE_CHECKING +from efro.error import CommunicationError +import bacommon.cloud import ba import ba.internal if TYPE_CHECKING: from typing import Any, Callable, Sequence +MERCH_LINK_KEY = 'Merch Link' + class StoreBrowserWindow(ba.Window): """Window for browsing the store.""" @@ -593,8 +600,14 @@ class StoreBrowserWindow(ba.Window): else: self._last_buy_time = curtime - # Pro is an actual IAP; the rest are ticket purchases. - if item == 'pro': + # Merch is a special case - just a link. + if item == 'merch': + url = ba.app.config.get('Merch Link') + if isinstance(url, str): + ba.open_url(url) + + # Pro is an actual IAP, and the rest are ticket purchases. + elif item == 'pro': ba.playsound(ba.getsound('click01')) # Purchase either pro or pro_sale depending on whether @@ -681,7 +694,9 @@ class StoreBrowserWindow(ba.Window): assert self.button_infos is not None for b_type, b_info in self.button_infos.items(): - if b_type in ['upgrades.pro', 'pro']: + if b_type == 'merch': + purchased = False + elif b_type in ['upgrades.pro', 'pro']: purchased = ba.app.accounts_v1.have_pro() else: purchased = ba.internal.get_purchased(b_type) @@ -707,7 +722,11 @@ class StoreBrowserWindow(ba.Window): color = (0.4, 0.8, 0.1) extra_image_opacity = 1.0 call = b_info['call'] if 'call' in b_info else None - if b_type in ['upgrades.pro', 'pro']: + if b_type == 'merch': + price_text = '' + price_text_left = '' + price_text_right = '' + elif b_type in ['upgrades.pro', 'pro']: sale_time = get_available_sale_time('extras') if sale_time is not None: priceraw = ba.internal.get_price('pro') @@ -917,7 +936,9 @@ class StoreBrowserWindow(ba.Window): # pylint: disable=too-many-locals # pylint: disable=too-many-branches # pylint: disable=too-many-nested-blocks - from bastd.ui.store import item as storeitemui + from bastd.ui.store.item import ( + instantiate_store_item_display, + ) title_spacing = 40 button_border = 20 @@ -1102,7 +1123,7 @@ class StoreBrowserWindow(ba.Window): + (b_width + button_spacing) * col, v - b_height + boffs_v2, ) - storeitemui.instantiate_store_item_display( + instantiate_store_item_display( item_name, item, parent_widget=cnt2, @@ -1325,3 +1346,41 @@ class StoreBrowserWindow(ba.Window): ) if self._on_close_call is not None: self._on_close_call() + + +def _check_merch_availability_in_bg_thread() -> None: + # pylint: disable=cell-var-from-loop + + # Merch is available from some countries only. + # Make a reasonable check to ask the master-server about this at + # launch and store the results. + for _i in range(15): + try: + if ba.app.cloud.is_connected(): + response = ba.app.cloud.send_message( + bacommon.cloud.MerchAvailabilityMessage() + ) + + def _store_in_logic_thread() -> None: + cfg = ba.app.config + current: str | None = cfg.get(MERCH_LINK_KEY) + if not isinstance(current, str | None): + current = None + if current != response.url: + cfg[MERCH_LINK_KEY] = response.url + cfg.commit() + + # If we successfully get a response, kick it over to the + # logic thread to store and we're done. + ba.pushcall(_store_in_logic_thread, from_other_thread=True) + return + except CommunicationError: + pass + except Exception: + logging.warning( + 'Unexpected error in merch-availability-check.', exc_info=True + ) + time.sleep(1.1934) # A bit randomized to avoid aliasing. + + +Thread(target=_check_merch_availability_in_bg_thread, daemon=True).start() diff --git a/assets/src/ba_data/python/bastd/ui/store/item.py b/assets/src/ba_data/python/bastd/ui/store/item.py index 246e84e9..078f3c9c 100644 --- a/assets/src/ba_data/python/bastd/ui/store/item.py +++ b/assets/src/ba_data/python/bastd/ui/store/item.py @@ -92,6 +92,10 @@ def instantiate_store_item_display( tint_tex = character.icon_mask_texture title_v = 0.255 price_v = 0.145 + elif item_name == 'merch': + base_text_scale = 0.6 + title_v = 0.85 + price_v = 0.15 elif item_name in ['upgrades.pro', 'pro']: base_text_scale = 0.6 title_v = 0.85 @@ -165,6 +169,23 @@ def instantiate_store_item_display( tint2_color=tint2_color, ) + if item_name == 'merch': + frame_size = b_width * 0.7 + im_dim = frame_size * (100.0 / 113.0) + im_pos = ( + b_pos[0] + b_width * 0.5 - im_dim * 0.5 + b_offs_x, + b_pos[1] + b_height * 0.5 - im_dim * 0.5, + ) + ba.imagewidget( + parent=parent_widget, + position=im_pos, + size=(im_dim, im_dim), + transition_delay=delay, + draw_controller=btn, + opacity=1.0, + texture=ba.gettexture('merch'), + ) + if item_name in ['pro', 'upgrades.pro']: frame_size = b_width * 0.5 im_dim = frame_size * (100.0 / 113.0) @@ -184,7 +205,6 @@ def instantiate_store_item_display( ) txt = ba.Lstr(resource='store.bombSquadProNewDescriptionText') - # t = 'foo\nfoo\nfoo\nfoo\nfoo\nfoo' item['descriptionText'] = ba.textwidget( parent=parent_widget, text=txt, diff --git a/ballisticacore-cmake/.idea/dictionaries/ericf.xml b/ballisticacore-cmake/.idea/dictionaries/ericf.xml index d584d5dc..d5ef5e70 100644 --- a/ballisticacore-cmake/.idea/dictionaries/ericf.xml +++ b/ballisticacore-cmake/.idea/dictionaries/ericf.xml @@ -459,6 +459,7 @@ fastldlt fastlsolve fastltsolve + faulthandler fbos fcntl fdata @@ -800,6 +801,7 @@ maskuv masterver mastervers + matchlines maximus maxpathlen maxtries @@ -1507,6 +1509,7 @@ wakeups walisser wasdebug + wasn watte wdeprecated weakref diff --git a/src/ballistica/ballistica.cc b/src/ballistica/ballistica.cc index fb6052c0..51a2e010 100644 --- a/src/ballistica/ballistica.cc +++ b/src/ballistica/ballistica.cc @@ -32,7 +32,7 @@ namespace ballistica { // These are set automatically via script; don't modify them here. -const int kAppBuildNumber = 20966; +const int kAppBuildNumber = 20967; const char* kAppVersion = "1.7.16"; // Our standalone globals. diff --git a/src/ballistica/platform/platform.cc b/src/ballistica/platform/platform.cc index 0bdb8a89..f3067fdd 100644 --- a/src/ballistica/platform/platform.cc +++ b/src/ballistica/platform/platform.cc @@ -221,8 +221,15 @@ auto Platform::GetPublicDeviceUUID() -> std::string { // This UUID is supposed to change periodically, so let's plug in // some stuff to enforce that. inputs.emplace_back(GetOSVersionString()); - inputs.emplace_back(kAppVersion); - inputs.emplace_back("kerploople"); + + // This part gets shuffled periodically by my version-increment tools. + // We used to plug version in directly here, but that caused uuids to + // shuffle too rapidly during periods of rapid development. This + // keeps it more constant. + // __last_rand_uuid_component_shuffle_date__ 2022 12 17 + auto rand_uuid_component{"BMCJPHH0SC22KB0WVJ1RAYD68TPEXL58"}; + + inputs.emplace_back(rand_uuid_component); auto gil{Python::ScopedInterpreterLock()}; auto pylist{g_python->StringList(inputs)}; auto args{g_python->SingleMemberTuple(pylist)}; diff --git a/tools/bacommon/cloud.py b/tools/bacommon/cloud.py index bb36f6c1..1e680a40 100644 --- a/tools/bacommon/cloud.py +++ b/tools/bacommon/cloud.py @@ -157,6 +157,24 @@ class WorkspaceFetchResponse(Response): done: Annotated[bool, IOAttrs('d')] = False +@ioprepped +@dataclass +class MerchAvailabilityMessage(Message): + """Can we show merch link?""" + + @classmethod + def get_response_types(cls) -> list[type[Response] | None]: + return [MerchAvailabilityResponse] + + +@ioprepped +@dataclass +class MerchAvailabilityResponse(Response): + """About that merch...""" + + url: Annotated[str | None, IOAttrs('u')] + + @ioprepped @dataclass class SignInMessage(Message):