@darkshadow2900/lethal-company-web 0.1.1-data.9 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.html +310 -0
- package/package.json +4 -3
- package/ccefd80599eef3f5b01b-051.bin +0 -0
- package/ccefd80599eef3f5b01b-052.bin +0 -0
- package/ccefd80599eef3f5b01b-053.bin +0 -0
- package/ccefd80599eef3f5b01b-054.bin +0 -0
- package/ccefd80599eef3f5b01b-055.bin +0 -0
- package/ccefd80599eef3f5b01b-056.bin +0 -0
- package/ccefd80599eef3f5b01b-057.bin +0 -0
- package/ccefd80599eef3f5b01b-058.bin +0 -0
package/index.html
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<meta charset="utf-8">
|
|
4
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover,user-scalable=no">
|
|
5
|
+
<meta name="theme-color" content="#090d09">
|
|
6
|
+
<title>Lethal Company</title>
|
|
7
|
+
<style>
|
|
8
|
+
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#000;color:#c6efbb;font:16px monospace}button,input{font:inherit}button{color:inherit;background:#142011;border:1px solid #6b885f;border-radius:5px;padding:10px;touch-action:none}input{color:inherit;background:#050805;border:1px solid #6b885f;padding:10px;width:100%}#unity-canvas{display:block;width:100%;height:100%;outline:none;touch-action:none}#loading{position:fixed;inset:0;background:#090d09;display:grid;place-content:center;gap:16px;padding:24px;z-index:20;text-align:center}#loading h1{font-size:clamp(24px,6vw,42px);margin:0}#loading progress{width:min(70vw,480px);accent-color:#9adb7f}#load-error{max-width:640px;white-space:pre-wrap;color:#ffba90}#toolbar{position:fixed;top:env(safe-area-inset-top,8px);right:env(safe-area-inset-right,8px);display:flex;gap:5px;z-index:8;opacity:.8}#toolbar button{padding:7px;font-size:12px}#session{position:fixed;inset:0;z-index:12;background:#000b;display:none;align-items:center;justify-content:center;padding:20px}#session.open{display:flex}#session form{display:grid;gap:12px;width:min(440px,100%);background:#090d09;border:1px solid #6b885f;padding:24px}#session label{display:grid;gap:6px}#session .row{display:flex;gap:8px}#session .row>*{flex:1}#connection-state{min-height:20px;font-size:13px;overflow-wrap:anywhere}.touch-ui{position:fixed;z-index:6;display:none;pointer-events:none;inset:0;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);touch-action:none}.touch-ui.active{display:block}.touch-ui button,.touch-ui .pad{pointer-events:auto;user-select:none;-webkit-user-select:none}.pad{position:absolute;left:max(22px,env(safe-area-inset-left));bottom:max(28px,env(safe-area-inset-bottom));width:130px;height:130px;border:1px solid #ffffff55;border-radius:50%;background:#0c180c44;touch-action:none}.stick{width:54px;height:54px;border-radius:50%;background:#a7c59d55;position:absolute;left:37px;top:37px;pointer-events:none}#look-pad{position:absolute;left:38%;right:0;top:12%;bottom:0;pointer-events:auto;touch-action:none}.touch-buttons{position:absolute;right:max(14px,env(safe-area-inset-right));bottom:max(22px,env(safe-area-inset-bottom));display:grid;grid-template-columns:repeat(3,65px);gap:7px;pointer-events:none}.touch-buttons button{font-size:12px;min-height:47px;background:#14201199}.touch-buttons button.pressed{background:#74936acc}.touch-extra{position:absolute;left:max(20px,env(safe-area-inset-left));bottom:174px;display:flex;gap:7px;pointer-events:none}.touch-extra button{font-size:12px;background:#14201199}#rotate-hint{display:none;position:fixed;left:0;right:0;top:44px;text-align:center;z-index:9;font-size:12px;background:#0008;padding:5px;pointer-events:none}@media(orientation:portrait){body.touch #rotate-hint{display:block}.touch-buttons{grid-template-columns:repeat(3,55px);gap:4px}.pad{width:110px;height:110px}.stick{left:27px;top:27px}.touch-extra{bottom:150px}}#voice-panel{display:none;position:fixed;inset:0;z-index:14;background:#000b;align-items:center;justify-content:center;padding:16px}#voice-panel.open{display:flex}#voice-panel section{max-height:90vh;overflow:auto;overscroll-behavior:contain;display:grid;gap:14px;background:#090d09;border:1px solid #6b885f;padding:22px;width:min(440px,100%)}#voice-panel label{display:grid;gap:7px}#voice-state{font-size:13px;overflow-wrap:anywhere}#voice-hold{position:fixed;bottom:max(185px,env(safe-area-inset-bottom));right:20px;z-index:10;background:#142011cc;touch-action:none}[hidden]{display:none!important}
|
|
9
|
+
</style>
|
|
10
|
+
<canvas id="unity-canvas" tabindex="0"></canvas>
|
|
11
|
+
<div id="loading"><h1>LETHAL COMPANY</h1><div id="load-status">Ready to load</div><progress id="load-progress" max="1" value="0"></progress><button id="start">Start game</button><div id="load-error"></div></div>
|
|
12
|
+
<div id="runtime-error" hidden role="alert" style="position:fixed;inset:12% 8% auto;z-index:30;background:#180b0b;color:#fff;padding:20px;border:1px solid #b66"><strong>Game error</strong><pre id="runtime-error-text" style="white-space:pre-wrap;max-height:35vh;overflow:auto"></pre><button onclick="location.reload()">Reload game</button> <button onclick="this.parentElement.hidden=true">Close</button></div>
|
|
13
|
+
<div id="toolbar"><button id="session-button">Session</button><button id="voice-button">Voice</button><button id="touch-toggle">Touch controls</button><button id="fullscreen">Fullscreen</button></div>
|
|
14
|
+
<div id="pointer-hint" hidden style="position:fixed;top:45px;right:12px;z-index:9;background:#111d;padding:8px;pointer-events:none">Click the game to enable mouse look.</div>
|
|
15
|
+
<div id="rotate-hint">Turn your phone sideways for more room.</div>
|
|
16
|
+
<div id="session"><form id="session-form"><strong>Play together</strong><label>Relay server<input id="relay" placeholder="ws://192.168.1.10:8000/relay" autocomplete="off"></label><label>Room code<input id="room" value="crew" maxlength="24" autocomplete="off"></label><label>Name<input id="player-name" value="Employee" maxlength="18" autocomplete="off"></label><div class="row"><button type="button" id="host">Host</button><button type="button" id="join">Join</button><button type="button" id="session-close">Close</button></div><button type="button" id="server-download">Get laptop server</button><button type="button" id="invite-copy">Copy invite link</button><input id="invite-link" readonly hidden aria-label="Invite link"><div id="connection-state">For multiplayer, run the server on your laptop.</div></form></div>
|
|
17
|
+
<div class="touch-ui" id="touch-ui"><div id="look-pad"></div><div class="pad" id="move-pad"><div class="stick" id="move-stick"></div></div><div class="touch-extra"><button data-button="128">Sprint</button><button data-button="256">Scan</button><button data-button="512">◀ Item</button><button data-button="1024">Item ▶</button></div><div class="touch-buttons"><button data-button="1">Jump</button><button data-button="2">Interact</button><button data-button="4">Use</button><button data-button="8">Crouch</button><button data-button="16">Drop</button><button data-button="32">Inspect</button><button data-button="64">Build</button><button data-button="2048">Menu</button><button data-button="4096">Alt use</button></div></div>
|
|
18
|
+
<div id="voice-panel"><section aria-label="Voice chat"><strong>Crew voice chat</strong><div id="voice-state">Join a room, then enable voice.</div><button id="voice-enable">Enable voice</button><label>Microphone mode<select id="voice-mode"><option value="open">Open microphone</option><option value="push">Push to talk (hold V or Talk)</option></select></label><label>Crew volume<input id="voice-volume" type="range" min="0" max="1" step="0.05" value="0.85"></label><div>Nearby crew use proximity voice. Powered walkie-talkies carry speech over longer distances. Living crew cannot hear dead players.</div><button id="voice-stop">Turn voice off</button><button id="voice-close">Close</button></section></div><button id="voice-hold" hidden>Hold to talk</button>
|
|
19
|
+
<script>window.packedMode="cdn";window.packedManifest={"loader":{"gzipBytes":11137,"gzipSha256":"33a2d2ad234964aa7a7c519194c9672dc36cac366fbbd8314d734a31b54a0518","sourceSha256":"bba886064009ce8f67ff2edc70a53f3ed0822691ad715b36ea12fb29385f17c6","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/33a2d2ad234964aa7a7c-000.bin","bytes":11137,"sha256":"33a2d2ad234964aa7a7c519194c9672dc36cac366fbbd8314d734a31b54a0518"}]},"framework":{"gzipBytes":202047,"gzipSha256":"522a6df5a04f517e66af6ea27dcdfcc7ad33a2e717d18829da4ad79eaad02f08","sourceSha256":"eddb069e4ece84d24983e198cabba2d7ad90ddca87a011b34d3adca68f912e5e","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/522a6df5a04f517e66af-000.bin","bytes":202047,"sha256":"522a6df5a04f517e66af6ea27dcdfcc7ad33a2e717d18829da4ad79eaad02f08"}]},"wasm":{"gzipBytes":46490457,"gzipSha256":"758f3ec0534ba6966cfdec02a1a6cf05c428146cf75cffe1224bc7adf93b8d86","sourceSha256":"f075724595cff32ae6a87193bb9f181439f20d38c7076e14c73f5065a1d86116","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-000.bin","bytes":4194304,"sha256":"7bb8e70e6c6d53a91ab5a3809cfc7319431bdcadb99f84eb060c93dcecd63ada"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-001.bin","bytes":4194304,"sha256":"dd4113651ffb313989a39a101f43d4baab4339f8829709466e86ffadff7a43d7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-002.bin","bytes":4194304,"sha256":"22be99e5e3593504a64f1f88da87068c6b387a35914dd954f4536300c5e49f3d"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-003.bin","bytes":4194304,"sha256":"3eacee5e32c2ae7c35facc13bb922c4ce19f905025b6f76c98754f4e666399d7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-004.bin","bytes":4194304,"sha256":"06b62aff3fe36be338fbb716ef215602c33aedfef69b41bfdbf761e62e8d85ec"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-005.bin","bytes":4194304,"sha256":"c5cd9f37a75bfb61131a0635e68cb6866f1d4a43785dd8ad4471603d05c43d7e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.1/758f3ec0534ba6966cfd-006.bin","bytes":4194304,"sha256":"af8f71652e44fe898c3ddbe088ec7b7a488f974dbf96ba115c49b689da2f019c"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/758f3ec0534ba6966cfd-007.bin","bytes":4194304,"sha256":"79d97234f5cac717d1d3bc7e23fd3459e7cd2baf591460378cca4daacd0757f5"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/758f3ec0534ba6966cfd-008.bin","bytes":4194304,"sha256":"68e48b6a72229e464be9077d9a6de82736919b12fe77bf6d1d9df32cf6330ab3"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/758f3ec0534ba6966cfd-009.bin","bytes":4194304,"sha256":"164021f6e6160a4bd60f9202362f4166d1a6172488eb1c6aad7727559042a6cb"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/758f3ec0534ba6966cfd-010.bin","bytes":4194304,"sha256":"d3d256cfee67fa6e86b30ec9372ebc5261d87fd0ea9a457aec5a327de9c16f2a"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/758f3ec0534ba6966cfd-011.bin","bytes":353113,"sha256":"14886c23d99f3161fb49f846d44628c8c0f6cdccf51f9e9ab1f0269c973920cd"}]},"data":{"gzipBytes":480325406,"gzipSha256":"ccefd80599eef3f5b01b32e161a472d436a4791209b053197dec995163989fa4","sourceSha256":"38def0a7307f7a9a093aee3b6b340f350b9bee675075ad3d8085c255d043d6de","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/ccefd80599eef3f5b01b-000.bin","bytes":4194304,"sha256":"bfa12241066b9221463900f41c556f834ad6149f858bddeb58dc50ed59155728"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/ccefd80599eef3f5b01b-001.bin","bytes":4194304,"sha256":"070e326302b1f2cecda462bd897410c87103f403e78192a07702243bed77c210"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.2/ccefd80599eef3f5b01b-002.bin","bytes":4194304,"sha256":"1a53ee94fc3958704d0620d1adb6d02487c9051dfaf64381b076a283f2ae9616"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-003.bin","bytes":4194304,"sha256":"5d5ce0b391ca336ff630b65175da1e98016e1e68ce605ede05c9ea8fc32c8384"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-004.bin","bytes":4194304,"sha256":"faec9b315915f64dff96ca9bd081423540a81918039d5e6dc4d3d0e22ffe2f84"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-005.bin","bytes":4194304,"sha256":"b710946d16660aebfc72c236b638f73c824f947799cd50a728879ea01807213f"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-006.bin","bytes":4194304,"sha256":"57e9fefd558e1ee87caf12ffd01dfcbe3ed0981c1945a79d6d3ff61eef0767be"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-007.bin","bytes":4194304,"sha256":"d3a5516c8b4d2c69d81b46ab086806fbe6d262afc575f039b12500d540c56af2"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-008.bin","bytes":4194304,"sha256":"0295cfa1b2eb8c1857473a7968bad872551165a241d36f84ce834f7031806cfe"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-009.bin","bytes":4194304,"sha256":"13f54aa8f27aadd7641d73339202e2c750a7d9e5620b147d4c39b3b6193700e3"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.3/ccefd80599eef3f5b01b-010.bin","bytes":4194304,"sha256":"340e55de9c27a6838fd471b4b19b564292011afc71750c9ae5c11de33a98f6ae"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-011.bin","bytes":4194304,"sha256":"09d63c70d2df9f99691fe62304da1a229fdeaee45cbb610cd4facb4d48445e8c"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-012.bin","bytes":4194304,"sha256":"76783fe630e5158304376023069425ef1574b5cf5bf2c9582f99eee2e8dbb41e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-013.bin","bytes":4194304,"sha256":"1500a5540b2e1f5a7c2ce5af0fec6833187551248f9be816d7cf5b5885e924cb"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-014.bin","bytes":4194304,"sha256":"9aa89ad66b7f1f0cbe880eaf6ef095bad4ae3a7085bd665f5e6a51c2054451eb"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-015.bin","bytes":4194304,"sha256":"31b325819c14a0f05ee05bbe92f5f22fc7da04f7f31c5aeabb2cc2ff7d697e51"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-016.bin","bytes":4194304,"sha256":"9a116f2db2eb4ce3dd7ab4c42fc41fce5de06d4db85f20acbb0e98d2ecbe77d6"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-017.bin","bytes":4194304,"sha256":"44e536fdc197ff568d5911c394cf0c7a414c7a3a217962b8e062a0305238b90e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.4/ccefd80599eef3f5b01b-018.bin","bytes":4194304,"sha256":"72d234b55c898702a0f6d1b81b7b8e7fd09ca92d295e4f83cc3f154aba3616a0"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-019.bin","bytes":4194304,"sha256":"dc2e223800fb6d6424fa667691311b6197c7cab93eab3688a74b7a7fc28ce2c6"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-020.bin","bytes":4194304,"sha256":"78f627c6ad6d33a12f853c16f9dc17cc18733519e6984b9139d427aa86f658cc"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-021.bin","bytes":4194304,"sha256":"76f2488fed610b9d141e40b4e5ce8f57be7a1c33ca970356dc622f5505224e60"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-022.bin","bytes":4194304,"sha256":"576d40c56322106615bede0489f6a499bf96f45269f4e4d7cc68f5e147078518"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-023.bin","bytes":4194304,"sha256":"fc43a387d9924d4c65cd27fc5addd1af776d4702057474ec4dd7f538b3ec5345"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-024.bin","bytes":4194304,"sha256":"d600e0d2f8ae0b28e47b8bfae6b09cf6c37da27b4500756a2f828e4af8a0c82d"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-025.bin","bytes":4194304,"sha256":"139bd9694a636fc72096851c4908664fb33f43e5308c849d40ab481dc5486cac"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.5/ccefd80599eef3f5b01b-026.bin","bytes":4194304,"sha256":"981863955d19f0a3764a3b3d055011ed9bbcc7c5dc687984aef32a226997103e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-027.bin","bytes":4194304,"sha256":"cc00258c8b086e4c6a990b634d876225d45cfa0b2951c2256000189e473df409"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-028.bin","bytes":4194304,"sha256":"37e8e5a89ba190863019e4087387e8d7b54833a5faa2558b3cd21337dbf07290"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-029.bin","bytes":4194304,"sha256":"b19e4a288e6fa0a038b9f8e8f4c5932c185a680bd3cb0f92c260b76c80ae1f99"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-030.bin","bytes":4194304,"sha256":"a1dc085bf166e37b6b2ed3c71a6739cd5784d9ecfc3936a9f05d8f17ff1f3f49"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-031.bin","bytes":4194304,"sha256":"cc62ddfb1913fe6a6c89bcb88a40db00dda920548d55b565e07df0782d61eb50"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-032.bin","bytes":4194304,"sha256":"be4b4ee2a238bfd83180e06c0f44522249d11e8a40aed00200665f3a83277860"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-033.bin","bytes":4194304,"sha256":"6158c56acc805bf7379f53e944903d79973c3aae679afddee507c3146076ea11"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.6/ccefd80599eef3f5b01b-034.bin","bytes":4194304,"sha256":"09be20436a05804004ceb41a8f92a7875bd7e574d346e35d13162d4c257e87a3"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-035.bin","bytes":4194304,"sha256":"1a8e214782e9d5e956056ee7ebc6b7f01bba29a1234eb54bede1a28f45062f0f"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-036.bin","bytes":4194304,"sha256":"2017e382b8162b2a08509c76084a178aa02bcfa887919def302c03e937e82f95"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-037.bin","bytes":4194304,"sha256":"26cb498f9e0a651d2eed4339e4ac510a3654821c9b56c37907e467727ba82c50"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-038.bin","bytes":4194304,"sha256":"8405eab4e1386571a9f901dce0307626cb9eebd7351dc7caf901a18d1087679e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-039.bin","bytes":4194304,"sha256":"5d89213e289dfcffb809cf8362b003f9fdd69281d7164627a42f0b660fedd0c9"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-040.bin","bytes":4194304,"sha256":"7b40056618922d39fb48862b722a0b46f78df4c2d0339f63edf1ffcf54a22ba3"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-041.bin","bytes":4194304,"sha256":"538656e99a3882bb6d0ef3047826e56122a007b7fc6c60ed815b97cd99029d77"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.7/ccefd80599eef3f5b01b-042.bin","bytes":4194304,"sha256":"11dcb1a7d91c58926eae92ec623c91840a919796efed6abec55f591cc8ed5688"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-043.bin","bytes":4194304,"sha256":"bf42554775a14f4b52fea22ec255b28aad0e78e0ee8743c44b2727bcfc2386ea"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-044.bin","bytes":4194304,"sha256":"58b1ec27c84a52e0a3e6d8adf750725262379147378d78c80687ab8b9f236c1c"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-045.bin","bytes":4194304,"sha256":"5903e4491534b74743e464cf28df3caa01b15435a5fe11dfff53d1f4f2d6e3af"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-046.bin","bytes":4194304,"sha256":"5fe70f551eb51417b9b398efb74f8d1144e41f70a933a500611088f677a7a547"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-047.bin","bytes":4194304,"sha256":"f400ef27984b0cf624cf35e07fc57c35cf4d56c8678a13d9a6f2e4dfbdcc1fc5"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-048.bin","bytes":4194304,"sha256":"f6ce9d25ac05c4e9fbd66da59b4753cd259aca4bba21d1225cb116339ade0a75"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-049.bin","bytes":4194304,"sha256":"89b8298951cb7f7cd792415a9ec4570094740b7d51eb2aaa2fb4f0f5e80bc2b7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.8/ccefd80599eef3f5b01b-050.bin","bytes":4194304,"sha256":"510e52d97a6dd9819c80d91b540d74e95e886f3e0feef3da607954889e463327"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-051.bin","bytes":4194304,"sha256":"785870d66f9e16d80e66f706fe5b533d1dbbd5949a05faa2e05703956a5f77b9"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-052.bin","bytes":4194304,"sha256":"4c8f173598f961c77162c7a72192f03efb084b67c367bfe96d235b7ab4c82253"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-053.bin","bytes":4194304,"sha256":"66bc1de4afd015cc0540c4af561c8b3eb52f2dcd71fe7a091208f94336e2d4f8"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-054.bin","bytes":4194304,"sha256":"49a821dfcde25d95978f842ad109c9a2205aa9b0daf873da9f13951d4d33e9b6"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-055.bin","bytes":4194304,"sha256":"27385365e157e4e3aa567385db3226caeab8bc1b8e57bf8c8792475ee23d131b"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-056.bin","bytes":4194304,"sha256":"9e96c03b869e74c675da9481e518bd2092763efaf1781400ef1c74f443eb5a0c"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-057.bin","bytes":4194304,"sha256":"10ebc8af20c2310f787f2a75f9ac368bf15176fdbc544f05230f9b58c1472845"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.9/ccefd80599eef3f5b01b-058.bin","bytes":4194304,"sha256":"dc14836962cd32ad40afc335d9e20721259b3c2e28eba00ed30fac7b5e8e22dc"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-059.bin","bytes":4194304,"sha256":"d41d966807ff0302116db48d7b4c6e493416077030bf4812bc16fb59b24b5316"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-060.bin","bytes":4194304,"sha256":"cf8c42a3d04ac207567ca0df020baab0fa2612e411d51d2bc3cd2b3f56f25256"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-061.bin","bytes":4194304,"sha256":"74b17fdfdc31d20484d90ef512efcf345d0fec8fdf0a16bd5e20e24ca3343b90"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-062.bin","bytes":4194304,"sha256":"ee5fc00334622dd456a96b057913fb39110eb8f873059eefc3c6719b57a235ac"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-063.bin","bytes":4194304,"sha256":"25b600a3403bdc45c66b6820655ae453cbbed8d267cc6efa69eaf1fcd3f9e9c1"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-064.bin","bytes":4194304,"sha256":"c1ea3538f3dcb7ed5a25f826f626383d8123fc611d84c7cfbcf491ddbe27ee11"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-065.bin","bytes":4194304,"sha256":"f07d90075bf51ff4d641ac81bbde4ab53775827ca7d5d1d062ef18565fd401fa"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.10/ccefd80599eef3f5b01b-066.bin","bytes":4194304,"sha256":"26f0df8461ead8ca453530d06b7c423455d8833bb0dceb57481a57af917cd4f3"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-067.bin","bytes":4194304,"sha256":"d71f6d194ee4e2ad81298a5e0b71d53d1d0ec36b1205be1477cda5773dd527af"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-068.bin","bytes":4194304,"sha256":"1d195a6d8bd59427ac10e99952e37eb8fa3e412120fccb5ff7cc58f94fa6aaa5"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-069.bin","bytes":4194304,"sha256":"4fef3eddb389af1584e5e966e4844a9b60542469a8fa9c869e7f094bdba6260c"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-070.bin","bytes":4194304,"sha256":"ac437b4689c826e24806f4feb09342639d8989088de6a70697b5688cc0562184"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-071.bin","bytes":4194304,"sha256":"4bfb74b220e52e27db2f01d12416ac0916a02c7da588632c25837a92342a9e29"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-072.bin","bytes":4194304,"sha256":"f0d5b85e42dd06d9fe3b11bd61b0c013db672447a1b9b0444d0c37fb94e4a243"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-073.bin","bytes":4194304,"sha256":"2ae898311edcc663b281db2b6840949fbd50b9ef9b4106586e449a08f46858ac"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.11/ccefd80599eef3f5b01b-074.bin","bytes":4194304,"sha256":"e9b48a0a4e6d5632053b13e35cb768a78bde8962c8e99dc2995c1c47c1493909"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-075.bin","bytes":4194304,"sha256":"790174d6185b14b11945a965a514c74acc352f23a8f5482227af62986f836f2a"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-076.bin","bytes":4194304,"sha256":"4dd92eba184c04628775f16fd22da0c022f69defa17239eb2e7ce3e6747c019b"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-077.bin","bytes":4194304,"sha256":"39a4cdcb451c61c694bbbeafbff3a4a1fb932acd774fc1001073809000b00be4"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-078.bin","bytes":4194304,"sha256":"bec95bed470c1d011e0dd0fc9e23e7bb324325ac190dfb35fde6c0fee90c57a8"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-079.bin","bytes":4194304,"sha256":"3ebddf3f9bfa5a77884683996f892c3c2ce26dcc7934f966477a347056d41998"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-080.bin","bytes":4194304,"sha256":"af386fc34fd20093a0cec4aa39e6702ad3d6743dc4457ba60e48c52775025103"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-081.bin","bytes":4194304,"sha256":"edcf2f6be6d627f9a16c46e55bc0707fc2a9b99f918464d8be32a5818e89fa25"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.12/ccefd80599eef3f5b01b-082.bin","bytes":4194304,"sha256":"85b9feadc2d343c638d5c8260b94aebc3afb62c801348b252c21012dc5073e9e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-083.bin","bytes":4194304,"sha256":"f50a650f4f2516b74c808da5c48a98da8902ba4b61814aee97b5407a66ff2f4d"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-084.bin","bytes":4194304,"sha256":"5b61822c0bc235a6f23becf8d56a289c5d98d9f8b0a293eef7f46c2405fd72a3"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-085.bin","bytes":4194304,"sha256":"e161ea3682f9f150db9bb084c5c50c1aaa4bf0ea34f45d9dc2acbab67c29c0b2"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-086.bin","bytes":4194304,"sha256":"d08e3952235647bffcb85df23564c372c70d67d0263fe76031d294ef16ea69f7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-087.bin","bytes":4194304,"sha256":"1298bb574a3facfd9b62ea7b0ff12368f561e2b0ac537c2b09f8aace11c96a74"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-088.bin","bytes":4194304,"sha256":"e6e6a7487492084275a581e836b42398c4f8a6c9584a8775d941e975838d62bd"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-089.bin","bytes":4194304,"sha256":"b81070d04a71b536131f9296cb477b66a01b6220f5953820c06031738ef47c7e"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.13/ccefd80599eef3f5b01b-090.bin","bytes":4194304,"sha256":"76725fa6d0a3680c5ce699e5935c2d8a11adee70724a2fb318be2871f3f9552b"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-091.bin","bytes":4194304,"sha256":"8f1bea9afd834e1337db3d18e820607d9c1b60e53a128a45438de5b6df012c65"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-092.bin","bytes":4194304,"sha256":"6412160cab85c4793aff73257ffb948b9760a8f0e4c25a551ee4be4b5416b7c0"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-093.bin","bytes":4194304,"sha256":"c6a9f27803c23c13004b9ed90f329d95dbe9abf1e37204d50434d329e91569fa"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-094.bin","bytes":4194304,"sha256":"4fef86985545e79a91155079acc8b90ce20f222e525db42151c2589d1bf7ae0b"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-095.bin","bytes":4194304,"sha256":"97e9aa6139c8d9e73623ae13d906beff0a9b3dccce1db7c74a24456df1a300e9"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-096.bin","bytes":4194304,"sha256":"e83bf2d47df0939a0b7a6c101da1f5aa310b786dedc9accfe87d30db2d11c4fa"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-097.bin","bytes":4194304,"sha256":"550b6175521dca9c008cb2deee3ac3deebbeef3cc3d5423687de87390dea72b2"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.14/ccefd80599eef3f5b01b-098.bin","bytes":4194304,"sha256":"b86dfd48d8f5d83cbbd21bef42c53e6e0a8bea607db939a0d92c42902cdf86e7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-099.bin","bytes":4194304,"sha256":"fbb6afe2c9a64d9077c08300b0aa93693cebf72d0f80d7361de3a9973cc1ebcc"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-100.bin","bytes":4194304,"sha256":"626bb2b935f8559ee4850b802d2fa22b7feb6c6e2f82f8407eacb0bdc70306ea"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-101.bin","bytes":4194304,"sha256":"611e43b0a3c084eebfb8d568ce229b65066300ecf38bf079eb6482b19139213a"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-102.bin","bytes":4194304,"sha256":"7698b8d97fd152251cfe455761cdb8ee6ec9b2a1f3c3aa035b46fbb6b2c189ff"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-103.bin","bytes":4194304,"sha256":"c4c665fe0b224dd2fe5c65a5d9265d70ced645f54749ff3d4d2d36dd6c3b48c7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-104.bin","bytes":4194304,"sha256":"0e317471b092c7c800438481351d019135310dae4ebe794dfa25e4b28680524c"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-105.bin","bytes":4194304,"sha256":"9bfe75566cc9bf5351b7921e35b9316013de1e859af9e545542ada8f46e33d8b"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.15/ccefd80599eef3f5b01b-106.bin","bytes":4194304,"sha256":"59d54d6e1532c2d643277378f8c2ffedaf37f7d82320dac4e811e204da7e71c6"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-107.bin","bytes":4194304,"sha256":"b1dc530f2d70ad54ea90b22e26ebcd0d26576440ba25b32a7b3fda26c47e92a1"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-108.bin","bytes":4194304,"sha256":"f7c9fdf9795ae60bb039aeec175902610bb3a3a6913e44393b20c4c91cfb2f86"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-109.bin","bytes":4194304,"sha256":"0a7826747ce974bd0aa5b7920503a57cd63210d7de043da81920eab7279e52f1"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-110.bin","bytes":4194304,"sha256":"547b0c56f7625e532517730dee639345157132c407b94a457f4dcab8dd009c26"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-111.bin","bytes":4194304,"sha256":"ad189fd9fbfcc9d174c2da2693196d5d487fb251ecdf0924283cb97fdc9458e6"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-112.bin","bytes":4194304,"sha256":"cd4e6a382c124aae67361bdbfb43fc0ac3cdef98324db551600c875a36833ab8"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-113.bin","bytes":4194304,"sha256":"1312d1b47cdd7c6b7bc0b2743dc78c046ab2ead26670f0d4b87c4eed96205fd1"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.1-data.16/ccefd80599eef3f5b01b-114.bin","bytes":2174750,"sha256":"dec0126c92cfabc6cff829c58513f618beba6c40188f176dcde04f50c78ea1b5"}]},"streaming:LethalVideo/BaboonHawkVideo0001-0109.m4v":{"gzipBytes":975410,"gzipSha256":"3dd15053a5f81f7fc48c161815252d2f4984dd80ad3b477691bdf4db930bc3d6","sourceSha256":"21c52b6e3eba57335de1f955c3a134281031615cad1de7102e5f84b8a5569e45","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.16/3dd15053a5f81f7fc48c-000.bin","bytes":975410,"sha256":"3dd15053a5f81f7fc48c161815252d2f4984dd80ad3b477691bdf4db930bc3d6"}]},"streaming:LethalVideo/BrackenVideo0001-0100.m4v":{"gzipBytes":1115978,"gzipSha256":"6dfa91f3a97f6f0a4ba921fd559f1f84142d4d29cfb16c48feb2ebd108bc2a1a","sourceSha256":"505d856720015ed4e03f59e529275c5995ee64bf1520aec8b40e065ce2f5d9f0","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/6dfa91f3a97f6f0a4ba9-000.bin","bytes":1115978,"sha256":"6dfa91f3a97f6f0a4ba921fd559f1f84142d4d29cfb16c48feb2ebd108bc2a1a"}]},"streaming:LethalVideo/BunkerSpiderVideo0001-0109 1.m4v":{"gzipBytes":1378172,"gzipSha256":"4a183ab8f691e9f366fbfd1d6e18803892cef57b11cdd0433adc192080613ff7","sourceSha256":"e7531bb3ea9384636edcaa67478553c89b2217c227f9f29d891aed2f0cf0f60e","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/4a183ab8f691e9f366fb-000.bin","bytes":1378172,"sha256":"4a183ab8f691e9f366fbfd1d6e18803892cef57b11cdd0433adc192080613ff7"}]},"streaming:LethalVideo/BushWolfVideo0001-0109.m4v":{"gzipBytes":1301188,"gzipSha256":"c17c4d0ff43fb71d9d441254a6d9b18f54ba58a96e72188527acfca3ddae9d07","sourceSha256":"60015d61284ea5889472e2d87aa04a37c595d7d4f6e539091c89d24cf16a7319","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/c17c4d0ff43fb71d9d44-000.bin","bytes":1301188,"sha256":"c17c4d0ff43fb71d9d441254a6d9b18f54ba58a96e72188527acfca3ddae9d07"}]},"streaming:LethalVideo/ButlerVideo0001-0109.m4v":{"gzipBytes":1347685,"gzipSha256":"f2a7f48ca23e620ed2b169ac8084c05e42d82b5e27f480ade1b593680c908a68","sourceSha256":"5541ce5548807539e5a8d9b3ab457ef0948359e6f9a353da914fe657d0b1513a","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/f2a7f48ca23e620ed2b1-000.bin","bytes":1347685,"sha256":"f2a7f48ca23e620ed2b169ac8084c05e42d82b5e27f480ade1b593680c908a68"}]},"streaming:LethalVideo/CadaverBloomVideo0001-0109.m4v":{"gzipBytes":1265657,"gzipSha256":"14bcc95cc3017a2fd4fe760c6052a8d4dd72486c7de1250c6331d8a1fd0ec1a9","sourceSha256":"e427a3a63d129ddd59af7ad4831d416718dd8270b59a2721202c7eda6ec77e0e","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/14bcc95cc3017a2fd4fe-000.bin","bytes":1265657,"sha256":"14bcc95cc3017a2fd4fe760c6052a8d4dd72486c7de1250c6331d8a1fd0ec1a9"}]},"streaming:LethalVideo/CaveDwellerVideo0001-0109.m4v":{"gzipBytes":1316552,"gzipSha256":"195af0527cb7a3e78ee1ca744ce4f7ac9a3e09d0f39a22b9ab19f5ccb2278aa2","sourceSha256":"377e496e4290b40328fdc544760c723395a4ad6bd52a6d82b77972a1bd2d8daa","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/195af0527cb7a3e78ee1-000.bin","bytes":1316552,"sha256":"195af0527cb7a3e78ee1ca744ce4f7ac9a3e09d0f39a22b9ab19f5ccb2278aa2"}]},"streaming:LethalVideo/CoilheadVideo.m4v":{"gzipBytes":978442,"gzipSha256":"95b6a6ac47ea4f539ebeb9b115a59cbb81efbe21ce3b7c7a2ea8401e520d1b81","sourceSha256":"ed24743661c68408044b6e4f325a997aaa41e93bcc561f66a2cf0c05f0c1ea20","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/95b6a6ac47ea4f539ebe-000.bin","bytes":978442,"sha256":"95b6a6ac47ea4f539ebeb9b115a59cbb81efbe21ce3b7c7a2ea8401e520d1b81"}]},"streaming:LethalVideo/FeioparVideo0001-0109.m4v":{"gzipBytes":1325109,"gzipSha256":"219ab555e94ac2651eb70b6165ea9b5931f54011674db0a94a31e62fa3e9582f","sourceSha256":"31c670f775b13bd49dcb3c867a5a18a1bc1ce92a1038cff0035e3fd21714faf7","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/219ab555e94ac2651eb7-000.bin","bytes":1325109,"sha256":"219ab555e94ac2651eb70b6165ea9b5931f54011674db0a94a31e62fa3e9582f"}]},"streaming:LethalVideo/FlowerSnakeVideo0001-0109.m4v":{"gzipBytes":1230407,"gzipSha256":"2eda14b0aeac80fb46e12a413a2bb10dc86aca82369b644d9d897dd42dfb5e4f","sourceSha256":"15ebc8ba32518d22b5c0d4e78afc457bad1326a41b9eb1801357427fc0f3906a","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/2eda14b0aeac80fb46e1-000.bin","bytes":1230407,"sha256":"2eda14b0aeac80fb46e12a413a2bb10dc86aca82369b644d9d897dd42dfb5e4f"}]},"streaming:LethalVideo/ForestKeeperVideo0001-0109.m4v":{"gzipBytes":1354932,"gzipSha256":"57267ab03bb11fb99b751ecf51304388ec05bdcd6ab6e07efadfbaf7e83722f5","sourceSha256":"7245cb45844b87943a93f9244e8d7bb6ca50b371be2a8c4f2bbea981a14db676","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/57267ab03bb11fb99b75-000.bin","bytes":1354932,"sha256":"57267ab03bb11fb99b751ecf51304388ec05bdcd6ab6e07efadfbaf7e83722f5"}]},"streaming:LethalVideo/GiantKiwiVideo0001-0109.m4v":{"gzipBytes":1150885,"gzipSha256":"bad8d3c4e35e36059b924675fba0331c4a00e220734619af5c594f9de85105fb","sourceSha256":"193810b80e35170f637bceadf711b28729bae88e6098c57508755d9ea40d1aaa","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/bad8d3c4e35e36059b92-000.bin","bytes":1150885,"sha256":"bad8d3c4e35e36059b924675fba0331c4a00e220734619af5c594f9de85105fb"}]},"streaming:LethalVideo/HoardingBugVideo0001-0100.m4v":{"gzipBytes":1201512,"gzipSha256":"d8859fa4232b2f29c56a725fcdfc004cc870b57c92c23922d7c242b82c719166","sourceSha256":"dd436ed87077d5b7c0d2016db487a82fa32a61e063be682321382aa9c4323730","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/d8859fa4232b2f29c56a-000.bin","bytes":1201512,"sha256":"d8859fa4232b2f29c56a725fcdfc004cc870b57c92c23922d7c242b82c719166"}]},"streaming:LethalVideo/HygrodereVideo0001-0100.m4v":{"gzipBytes":1279369,"gzipSha256":"c64e2e683f489d6ef30e88420989edc7990278d3bca4eb1ce7a3b5eea60208e3","sourceSha256":"dbf0e0dd66965f732c5858aa4479cd0fd105f5b67223d1f09890be6898e05413","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/c64e2e683f489d6ef30e-000.bin","bytes":1279369,"sha256":"c64e2e683f489d6ef30e88420989edc7990278d3bca4eb1ce7a3b5eea60208e3"}]},"streaming:LethalVideo/JesterVideo0001-0109.m4v":{"gzipBytes":819111,"gzipSha256":"f072fc35a4317177d0ee2bb104ad0c18072d3779f0013261c481717aad16b63d","sourceSha256":"56ab914535e291444254616bb61e0be4fbafdec163dd0445eebbeb3740cd562e","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/f072fc35a4317177d0ee-000.bin","bytes":819111,"sha256":"f072fc35a4317177d0ee2bb104ad0c18072d3779f0013261c481717aad16b63d"}]},"streaming:LethalVideo/KittenChannel.m4v":{"gzipBytes":620559,"gzipSha256":"ba2fd76e397096f97eccf4a1347bf348366428d53bfeffeae8f91f10cb245a0b","sourceSha256":"7e4f8d8723c1d578cbf17c945de3fbb90d79067f2b5ed0a8c14f6d2087d67904","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/ba2fd76e397096f97ecc-000.bin","bytes":620559,"sha256":"ba2fd76e397096f97eccf4a1347bf348366428d53bfeffeae8f91f10cb245a0b"}]},"streaming:LethalVideo/LightningCartoon.m4v":{"gzipBytes":2639682,"gzipSha256":"483b827533133b7caec1b2602871a8940b1b10aacaaefa49f2850640b1c351db","sourceSha256":"0d9a03cc7cf315a87472eb6ff47ec19c36dd13507ba9a4ded3c4567d9890a734","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/483b827533133b7caec1-000.bin","bytes":2639682,"sha256":"483b827533133b7caec1b2602871a8940b1b10aacaaefa49f2850640b1c351db"}]},"streaming:LethalVideo/MapView220Ass.m4v":{"gzipBytes":156159,"gzipSha256":"094454ed151ffaaef37ec8bc97319ea81361a35d06b5652af044bfaea3939a6a","sourceSha256":"c9a9314c96213e919e9033c8187d90ea7fe8947d4486cc13041360ab7152895c","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/094454ed151ffaaef37e-000.bin","bytes":156159,"sha256":"094454ed151ffaaef37ec8bc97319ea81361a35d06b5652af044bfaea3939a6a"}]},"streaming:LethalVideo/MapView41Exp.m4v":{"gzipBytes":164592,"gzipSha256":"5d9da2d947e8beae55d30732b3581c5df71effc672549710e8e1bbec6518fefa","sourceSha256":"b6288de31030dbd1a4d307805f325060d7fc0da342d5217e4ddb60069b163673","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/5d9da2d947e8beae55d3-000.bin","bytes":164592,"sha256":"5d9da2d947e8beae55d30732b3581c5df71effc672549710e8e1bbec6518fefa"}]},"streaming:LethalVideo/MechVideo0001-0109.m4v":{"gzipBytes":1311751,"gzipSha256":"a79de25cfb24df5bbf59a588b7294a16e2f4f79d8fa690090596288f34189038","sourceSha256":"a4a3d34c7f0e6a29d8a6dc5ff5dc4fcf828a9bac2f39abc9899c55caf99dc410","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/a79de25cfb24df5bbf59-000.bin","bytes":1311751,"sha256":"a79de25cfb24df5bbf59a588b7294a16e2f4f79d8fa690090596288f34189038"}]},"streaming:LethalVideo/MouthDogVideo0001-0100.m4v":{"gzipBytes":1258627,"gzipSha256":"5cc0d31963092f3b5d2659bfbbf3978666fc273381104a4b04e2d0a245d07510","sourceSha256":"af120319d8bc5aa073392c2ee520b276e872349243aab94ac8c1d3de7911ecec","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/5cc0d31963092f3b5d26-000.bin","bytes":1258627,"sha256":"5cc0d31963092f3b5d2659bfbbf3978666fc273381104a4b04e2d0a245d07510"}]},"streaming:LethalVideo/NutcrackerVideo0001-0109.m4v":{"gzipBytes":1060483,"gzipSha256":"1b2a4690f8a23f0ff87b33eff9043b2e65d7850ba4f29c12f12f5f54beb4ce0b","sourceSha256":"3cc3a7b1edeb021b7dbf17c3c916116776da6857947aeef3708f316eb25ad9c1","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/1b2a4690f8a23f0ff87b-000.bin","bytes":1060483,"sha256":"1b2a4690f8a23f0ff87b33eff9043b2e65d7850ba4f29c12f12f5f54beb4ce0b"}]},"streaming:LethalVideo/SnareBugVideo0001-0100.m4v":{"gzipBytes":1301591,"gzipSha256":"7cd78ff8894391cb0deac1b1016fac55b613879dcd611b17747217b194d1d957","sourceSha256":"20fe7680910cda9d8f258aca451ebd197d688e3671f8e1f3ee588c36eb8c3a98","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/7cd78ff8894391cb0dea-000.bin","bytes":1301591,"sha256":"7cd78ff8894391cb0deac1b1016fac55b613879dcd611b17747217b194d1d957"}]},"streaming:LethalVideo/SnareFleaTipChannel2.m4v":{"gzipBytes":2763929,"gzipSha256":"51559da0e4cc56c7897cd21d2fe3312da3668cb47f2698156092b87306d8aba2","sourceSha256":"6f11d7a26c1add39846bd60bed1577eb481fd50e1c374bef0ead38bb48bd63cf","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/51559da0e4cc56c7897c-000.bin","bytes":2763929,"sha256":"51559da0e4cc56c7897cd21d2fe3312da3668cb47f2698156092b87306d8aba2"}]},"streaming:LethalVideo/StingrayVideo0001-0109.m4v":{"gzipBytes":917216,"gzipSha256":"782de02f5be2f9798ba172690010b80e8c2945779ae2af046e8a03681c0e2079","sourceSha256":"508dc09332d724a61e4a9e1072f6168ad5b85d1738c8d3dce6cc1ec89938b694","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/782de02f5be2f9798ba1-000.bin","bytes":917216,"sha256":"782de02f5be2f9798ba172690010b80e8c2945779ae2af046e8a03681c0e2079"}]},"streaming:LethalVideo/ThumperVideo.m4v":{"gzipBytes":1211521,"gzipSha256":"9473cd4bc6adda15de361106bc89941eb93a2d0339fc1a3c9aee34e3cc311895","sourceSha256":"ec482c5e1ea3a9127f972b1b76c449a60a80e5d58971b4fad484d57d903ab9c8","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/9473cd4bc6adda15de36-000.bin","bytes":1211521,"sha256":"9473cd4bc6adda15de361106bc89941eb93a2d0339fc1a3c9aee34e3cc311895"}]},"streaming:UnityServicesProjectConfiguration.json":{"gzipBytes":405,"gzipSha256":"25b11857181694127280fb8ef14183e6aaa25159595333bc8f3603bcc8408df6","sourceSha256":"9197fef04d58e1acdbef5c0b5d0e59461c661bbc9781e86773bae52e41e188f1","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/25b11857181694127280-000.bin","bytes":405,"sha256":"25b11857181694127280fb8ef14183e6aaa25159595333bc8f3603bcc8408df6"}]},"relayScript":{"gzipBytes":4271,"gzipSha256":"1faadf5aa05ec6c7db15ffcfebd2ad18f73f0755727b41042edf30f1646f9213","sourceSha256":"0e5ecb965dfac22ada5f2b4f0b5d6ed2b390c2586649358355c93f1431af7f23","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.17/1faadf5aa05ec6c7db15-000.bin","bytes":4271,"sha256":"1faadf5aa05ec6c7db15ffcfebd2ad18f73f0755727b41042edf30f1646f9213"}]},"serverBundle":{"gzipBytes":31114729,"gzipSha256":"92542b771810ccab820d650b71783516803500ea502bd700a23c7ebb9cbade57","sourceSha256":"82c8fa65c2cd6355cb9221e918e4d73209e6cff7f06eddca488477d21474ffed","parts":[{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-000.bin","bytes":4194304,"sha256":"49ff37b8d3b6670b21e204a35e0a9c0c667ec59674e1811d16141f23a9eecbee"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-001.bin","bytes":4194304,"sha256":"74a62119283fa092a910a4febe251004693e78440e03538f01eb437c20f8e3b5"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-002.bin","bytes":4194304,"sha256":"05088e232033952a0d5214a85f39d4f937d1675216341d2813b045f08ba9bbfd"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-003.bin","bytes":4194304,"sha256":"a0b870a7ad10d32beec9b0e08f3068b4b7ca41475a36acaf631a5f3fe4e7c3f7"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-004.bin","bytes":4194304,"sha256":"cd0a2709da940b0f9be582d6c0c93cbd83f5e6b5924ba257cf94e9eff716d034"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-005.bin","bytes":4194304,"sha256":"b7e57baa58a8a98bf871dcdc20196a0995c477bd68d0f080646171ae86b5e27f"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-006.bin","bytes":4194304,"sha256":"313d708e298c6537915b6762beb35f6ce14ffcebb358b583bf343a164796c3f6"},{"url":"https://unpkg.com/@darkshadow2900/lethal-company-web@0.1.0-data.18/92542b771810ccab820d-007.bin","bytes":1754601,"sha256":"e74f548c32503c6bd51334f51c6253ff65afecad721009eee866960bb0776453"}]}};</script>
|
|
20
|
+
<script>/* Mono PCM voice over the existing authenticated game relay; no external services. */
|
|
21
|
+
window.LethalVoice = class LethalVoice {
|
|
22
|
+
constructor(bridge) {
|
|
23
|
+
this.bridge=bridge; this.peers=new Map(); this.enabled=false; this.muted=false;
|
|
24
|
+
this.ptt=false; this.held=false; this.available=false; this.generation=0;
|
|
25
|
+
this.stats={sent:0,received:0,played:0,dropped:0};
|
|
26
|
+
this.button=document.querySelector('#voice-enable');
|
|
27
|
+
this.label=document.querySelector('#voice-state');
|
|
28
|
+
this.button.onclick=()=>this.enabled?this.setMuted(!this.muted):this.enable();
|
|
29
|
+
document.querySelector('#voice-mode').onchange=e=>{this.ptt=e.target.value==='push';this.held=false;if(this.enabled)this.setMuted(this.muted);else this.updateGate()};
|
|
30
|
+
document.querySelector('#voice-volume').oninput=e=>{if(this.master)this.master.gain.value=Number(e.target.value)};
|
|
31
|
+
document.querySelector('#voice-stop').onclick=()=>this.stop();
|
|
32
|
+
document.querySelector('#voice-button').onclick=()=>{
|
|
33
|
+
document.exitPointerLock?.(); document.querySelector('#voice-panel').classList.toggle('open');
|
|
34
|
+
this.context?.resume().catch(()=>{});
|
|
35
|
+
};
|
|
36
|
+
document.querySelector('#voice-close').onclick=()=>document.querySelector('#voice-panel').classList.remove('open');
|
|
37
|
+
const hold=document.querySelector('#voice-hold');
|
|
38
|
+
hold.onpointerdown=e=>{e.preventDefault();hold.setPointerCapture(e.pointerId);this.held=true;this.updateGate()};
|
|
39
|
+
hold.onpointerup=hold.onpointercancel=()=>{this.held=false;this.updateGate()};
|
|
40
|
+
window.addEventListener('keydown',e=>{if(e.code==='KeyV'&&!/INPUT|SELECT|TEXTAREA/.test(e.target.tagName)){this.held=true;this.updateGate()}});
|
|
41
|
+
window.addEventListener('keyup',e=>{if(e.code==='KeyV'){this.held=false;this.updateGate()}});
|
|
42
|
+
window.addEventListener('blur',()=>{this.held=false;this.updateGate()});
|
|
43
|
+
document.addEventListener('visibilitychange',()=>{this.held=false;this.updateGate();if(!document.hidden)this.context?.resume().catch(()=>{})});
|
|
44
|
+
window.addEventListener('pagehide',()=>this.stop());
|
|
45
|
+
}
|
|
46
|
+
status(text){this.label.textContent=text}
|
|
47
|
+
connected(message){
|
|
48
|
+
this.available=message.voice===true;
|
|
49
|
+
this.localId=message.id;
|
|
50
|
+
this.status(this.available?'Voice ready. Enable your microphone to talk and hear your crew.':'This relay needs the updated voice server.');
|
|
51
|
+
}
|
|
52
|
+
async enable(){
|
|
53
|
+
if(this.busy)return;
|
|
54
|
+
if(!this.available){this.status('Join a room using the updated laptop server first.');return}
|
|
55
|
+
if(!window.isSecureContext||!navigator.mediaDevices?.getUserMedia){this.status('Microphone access needs HTTPS or localhost. Open the secure game link.');return}
|
|
56
|
+
this.busy=true; const generation=++this.generation;
|
|
57
|
+
this.status('Allow microphone access when your browser asks.');
|
|
58
|
+
try{
|
|
59
|
+
const Context=window.AudioContext||window.webkitAudioContext;
|
|
60
|
+
const context=this.context=new Context({latencyHint:'interactive'});
|
|
61
|
+
const master=this.master=context.createGain();master.gain.value=Number(document.querySelector('#voice-volume').value);master.connect(context.destination);
|
|
62
|
+
await context.resume();
|
|
63
|
+
const stream=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:true,noiseSuppression:true,autoGainControl:true},video:false});
|
|
64
|
+
if(generation!==this.generation){stream.getTracks().forEach(t=>t.stop());return}
|
|
65
|
+
this.stream=stream;
|
|
66
|
+
const worklet=`class CrewCapture extends AudioWorkletProcessor {
|
|
67
|
+
constructor(){super();this.on=false;this.phase=0;this.sum=0;this.count=0;this.index=0;this.power=0;this.bytes=new ArrayBuffer(1280);this.view=new DataView(this.bytes);this.port.onmessage=e=>{this.on=e.data.active;this.index=0;this.power=0;this.phase=0;this.sum=0;this.count=0}}
|
|
68
|
+
process(inputs){const a=inputs[0]?.[0];if(!a||!this.on)return true;
|
|
69
|
+
for(let i=0;i<a.length;i++){this.sum+=a[i];this.count++;this.phase+=16000;if(this.phase>=sampleRate){this.phase-=sampleRate;const v=Math.max(-1,Math.min(1,this.sum/this.count));this.sum=0;this.count=0;this.view.setInt16(this.index*2,Math.round(v*(v<0?32768:32767)),true);this.power+=v*v;
|
|
70
|
+
if(++this.index===640){this.port.postMessage({pcm:this.bytes,rms:Math.sqrt(this.power/640),at:currentTime},[this.bytes]);this.bytes=new ArrayBuffer(1280);this.view=new DataView(this.bytes);this.index=0;this.power=0}}}return true}}
|
|
71
|
+
registerProcessor('crew-capture',CrewCapture);`;
|
|
72
|
+
const url=URL.createObjectURL(new Blob([worklet],{type:'text/javascript'}));
|
|
73
|
+
try{await context.audioWorklet.addModule(url)}finally{URL.revokeObjectURL(url)}
|
|
74
|
+
if(generation!==this.generation)return;
|
|
75
|
+
this.capture=new AudioWorkletNode(context,'crew-capture');
|
|
76
|
+
this.capture.port.onmessage=e=>this.transmit(e.data);
|
|
77
|
+
this.source=context.createMediaStreamSource(stream);this.source.connect(this.capture);
|
|
78
|
+
this.silent=context.createGain();this.silent.gain.value=0;this.capture.connect(this.silent).connect(context.destination);
|
|
79
|
+
stream.getAudioTracks()[0].onended=()=>{this.stop();this.status('Microphone disconnected. Enable voice again to reconnect.')};
|
|
80
|
+
await context.resume();
|
|
81
|
+
this.enabled=true;this.muted=false;
|
|
82
|
+
context.onstatechange=()=>{if(this.enabled&&context.state!=='running')this.status('Voice audio paused. Tap Voice to resume audio.')}
|
|
83
|
+
this.poll=setInterval(()=>{this.bridge.probe();this.spatial();this.updateGate()},150);
|
|
84
|
+
this.setMuted(false);
|
|
85
|
+
}catch(error){
|
|
86
|
+
if(generation===this.generation){this.stop();this.status(error.name==='NotAllowedError'?'Microphone permission was denied. Allow it in the browser’s site settings, then enable voice again.':'Voice could not start: '+error.message)}
|
|
87
|
+
}finally{this.busy=false}
|
|
88
|
+
}
|
|
89
|
+
setMuted(value){this.muted=value;this.updateGate();this.button.textContent=value?'Unmute microphone':'Mute microphone';this.status(value?'Microphone muted. You can still hear the crew.':this.ptt?'Voice on. Hold V or the Talk button to speak.':'Voice on. Your crew can hear you nearby.');document.querySelector('#voice-button').textContent=value?'Voice: muted':'Voice: on'}
|
|
90
|
+
updateGate(){
|
|
91
|
+
const active=this.enabled&&!this.muted&&!document.hidden&&(!this.ptt||this.held);
|
|
92
|
+
if(this.stream)this.stream.getAudioTracks().forEach(track=>track.enabled=active);
|
|
93
|
+
if(this.gate!==active){this.gate=active;this.capture?.port.postMessage({active})}
|
|
94
|
+
document.querySelector('#voice-hold').hidden=!this.enabled||!this.ptt;
|
|
95
|
+
}
|
|
96
|
+
transmit({pcm,rms,at}){
|
|
97
|
+
const socket=this.bridge.socket(),probe=this.bridge.state();
|
|
98
|
+
if(typeof at==='number'&&this.context&&this.context.currentTime-at>.25){this.stats.dropped++;return}
|
|
99
|
+
if(!this.gate||!this.available||socket?.readyState!==1||!(probe?.controlled||probe?.dead)||rms<.004)return;
|
|
100
|
+
if(socket.bufferedAmount>32768){this.stats.dropped++;return}
|
|
101
|
+
const bytes=new Uint8Array(pcm);let raw='';for(const byte of bytes)raw+=String.fromCharCode(byte);
|
|
102
|
+
socket.send(JSON.stringify({type:'voice',playerId:probe.localClientId??this.localId,payload:btoa(raw)}));this.stats.sent++;
|
|
103
|
+
if(!probe.dead&&performance.now()-(this.noiseAt||0)>350){this.noiseAt=performance.now();this.bridge.level(rms)}
|
|
104
|
+
}
|
|
105
|
+
receive(message){
|
|
106
|
+
if(!this.enabled||!this.context||message.id===this.localId)return;
|
|
107
|
+
let raw;try{raw=atob(message.payload)}catch{return}
|
|
108
|
+
if(raw.length!==1280)return;
|
|
109
|
+
this.stats.received++;
|
|
110
|
+
let peer=this.peers.get(message.id);
|
|
111
|
+
if(!peer){
|
|
112
|
+
const gain=this.context.createGain(),pan=this.context.createStereoPanner(),filter=this.context.createBiquadFilter();
|
|
113
|
+
gain.gain.value=0;filter.type='lowpass';filter.frequency.value=8000;
|
|
114
|
+
filter.connect(gain).connect(pan).connect(this.master);
|
|
115
|
+
peer={gain,pan,filter,next:0,sources:new Set()};this.peers.set(message.id,peer);
|
|
116
|
+
}
|
|
117
|
+
peer.playerId=message.playerId??message.id;
|
|
118
|
+
this.spatial();
|
|
119
|
+
const now=this.context.currentTime;
|
|
120
|
+
if(this.context.state!=='running'||peer.next>now+.28){this.stats.dropped++;return}
|
|
121
|
+
const buffer=this.context.createBuffer(1,640,16000),samples=buffer.getChannelData(0);
|
|
122
|
+
for(let i=0;i<640;i++){let value=raw.charCodeAt(i*2)|(raw.charCodeAt(i*2+1)<<8);if(value&32768)value-=65536;samples[i]=value/32768}
|
|
123
|
+
const source=this.context.createBufferSource();source.buffer=buffer;source.connect(peer.filter);
|
|
124
|
+
peer.sources.add(source);source.onended=()=>{peer.sources.delete(source);source.disconnect()};
|
|
125
|
+
const start=Math.max(now+.075,peer.next);source.start(start);peer.next=start+.04;this.stats.played++;
|
|
126
|
+
}
|
|
127
|
+
spatial(){
|
|
128
|
+
const p=this.bridge.state();if(!p||!this.context)return;
|
|
129
|
+
const ids=p.playerClientIds||[],local=ids.findIndex(id=>id===(p.localClientId??this.localId)),now=this.context.currentTime;
|
|
130
|
+
for(const [id,peer] of this.peers){
|
|
131
|
+
const i=ids.findIndex(value=>value===(peer.playerId??id));let gain=0,pan=0,radio=false,muffled=false;
|
|
132
|
+
if(i>=0&&local>=0&&(p.playerControlled?.[i]||p.playerDead?.[i])){
|
|
133
|
+
const dead=p.playerDead?.[i],localDead=p.playerDead?.[local];
|
|
134
|
+
if(localDead)gain=1;
|
|
135
|
+
else if(!dead){
|
|
136
|
+
const a=p.position,b=p.playerPositions?.[i];
|
|
137
|
+
if(a&&b){const dx=b.x-a.x,dz=b.z-a.z,dy=b.y-a.y,distance=Math.hypot(dx,dy,dz),yaw=(p.look?.y||0)*Math.PI/180;
|
|
138
|
+
const proximity=Math.pow(Math.max(0,1-Math.max(0,distance-2)/25),1.5);
|
|
139
|
+
radio=!!p.playerRadio?.[local]&&!!p.playerRadioSpeaking?.[i]&&proximity<.6;
|
|
140
|
+
muffled=!radio&&(!!p.playerOccluded?.[i]||p.playerInside?.[i]!==p.playerInside?.[local]);
|
|
141
|
+
gain=radio ? .65 : proximity*(muffled ? .4 : 1);pan=radio?0:Math.max(-1,Math.min(1,(dx*Math.cos(yaw)-dz*Math.sin(yaw))/Math.max(1,distance)));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
peer.gain.gain.setTargetAtTime(gain,now,.03);peer.pan.pan.setTargetAtTime(pan,now,.03);peer.filter.frequency.setTargetAtTime(radio?2800:muffled?1200:8000,now,.03);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
remove(id){const peer=this.peers.get(id);if(!peer)return;for(const source of peer.sources){try{source.stop()}catch{}source.disconnect()}peer.filter.disconnect();peer.gain.disconnect();peer.pan.disconnect();this.peers.delete(id)}
|
|
149
|
+
stop(){
|
|
150
|
+
++this.generation;this.enabled=false;this.gate=false;clearInterval(this.poll);
|
|
151
|
+
if(this.stream)for(const track of this.stream.getTracks()){track.onended=null;track.stop()}
|
|
152
|
+
this.stream=null;this.capture?.disconnect();this.source?.disconnect();this.silent?.disconnect();
|
|
153
|
+
if(this.capture){this.capture.port.onmessage=null;this.capture.port.close()}
|
|
154
|
+
for(const id of this.peers.keys())this.remove(id);
|
|
155
|
+
this.context?.close().catch(()=>{});this.context=null;this.capture=null;this.source=null;this.silent=null;
|
|
156
|
+
this.button.textContent='Enable voice';document.querySelector('#voice-button').textContent='Voice';document.querySelector('#voice-hold').hidden=true;this.status('Voice off. Microphone released.');
|
|
157
|
+
}
|
|
158
|
+
disconnected(){this.available=false;this.stop()}
|
|
159
|
+
};
|
|
160
|
+
</script>
|
|
161
|
+
<script>
|
|
162
|
+
"use strict";
|
|
163
|
+
if(window.packedMode==='range')window.stop();
|
|
164
|
+
const canvas=document.querySelector('#unity-canvas'), status=document.querySelector('#load-status'), progress=document.querySelector('#load-progress');
|
|
165
|
+
const state={moveX:0,moveY:0,lookX:0,lookY:0,buttons:0};
|
|
166
|
+
const assets={};let instance=null,touch=matchMedia('(pointer:coarse)').matches,playing=false,localSource=null;
|
|
167
|
+
const debug=window.lethalDebug={errors:[],logs:[],firstErrors:[],counts:Object.create(null)};
|
|
168
|
+
for(const kind of ['log','warn','error']){const original=console[kind].bind(console);console[kind]=(...args)=>{const message=args.map(String).join(' ').slice(0,2400),key=kind+':'+message;debug.counts[key]=(debug.counts[key]||0)+1;if(debug.counts[key]===1){const list=kind==='error'?debug.errors:debug.logs;list.push(message);if(list.length>120)list.shift();if(kind==='error'&&debug.firstErrors.length<40)debug.firstErrors.push(message)}original(...args)}}
|
|
169
|
+
window.addEventListener('error',e=>console.error(e.error?.stack||e.message));
|
|
170
|
+
window.addEventListener('unhandledrejection',e=>console.error(e.reason?.stack||e.reason));
|
|
171
|
+
function runtimeError(message){console.error(message);document.querySelector('#runtime-error-text').textContent=String(message);document.querySelector('#runtime-error').hidden=false;return true}
|
|
172
|
+
function resetTouch(){Object.assign(state,{moveX:0,moveY:0,lookX:0,lookY:0,buttons:0});document.querySelector('#move-stick').style.transform='';document.querySelectorAll('.pressed').forEach(button=>button.classList.remove('pressed'));if(touch)send('TouchState',state)}
|
|
173
|
+
function touchMode(value){if(!value||!playing)resetTouch();touch=value;if(value||!playing)document.querySelector('#pointer-hint').hidden=true;document.body.classList.toggle('touch',value);document.querySelector('#touch-ui').classList.toggle('active',value&&playing)}
|
|
174
|
+
touchMode(touch);
|
|
175
|
+
function configurePointerLock(){
|
|
176
|
+
const nativeRequest=canvas.requestPointerLock?.bind(canvas);
|
|
177
|
+
if(!nativeRequest)return;
|
|
178
|
+
const hint=document.querySelector('#pointer-hint');
|
|
179
|
+
function denied(){hint.hidden=touch||!playing}
|
|
180
|
+
canvas.requestPointerLock=(...args)=>{
|
|
181
|
+
if(touch||document.querySelector('#session').classList.contains('open')||document.querySelector('#voice-panel').classList.contains('open'))return Promise.resolve();
|
|
182
|
+
try{return Promise.resolve(nativeRequest(...args)).catch(denied)}catch(error){denied();return Promise.resolve()}
|
|
183
|
+
};
|
|
184
|
+
canvas.addEventListener('pointerdown',()=>{if(playing&&!touch&&document.pointerLockElement!==canvas)canvas.requestPointerLock()});
|
|
185
|
+
document.addEventListener('pointerlockchange',()=>{hint.hidden=document.pointerLockElement===canvas||touch||!playing});
|
|
186
|
+
}
|
|
187
|
+
configurePointerLock();
|
|
188
|
+
document.querySelector('#touch-toggle').onclick=()=>touchMode(!touch);
|
|
189
|
+
document.querySelector('#fullscreen').onclick=()=>{canvas.requestFullscreen?.().catch(()=>{});screen.orientation?.lock?.('landscape').catch(()=>{})};
|
|
190
|
+
document.querySelector('#session-button').onclick=()=>{resetTouch();document.exitPointerLock?.();document.querySelector('#session').classList.add('open')};
|
|
191
|
+
document.querySelector('#session-close').onclick=()=>document.querySelector('#session').classList.remove('open');
|
|
192
|
+
document.querySelector('#session-form').onsubmit=e=>e.preventDefault();
|
|
193
|
+
document.querySelector('#server-download').onclick=()=>{const link=document.createElement('a');link.href=assets.serverBundle||assets.relayScript;link.download=assets.serverBundle?'LaptopServer.zip':'server.py';link.click()};
|
|
194
|
+
document.querySelector('#relay').value=window.packedMode==='cdn'?'':location.protocol==='https:'?'wss://'+location.host+'/relay':location.protocol==='http:'?'ws://'+location.host+'/relay':'ws://localhost:8000/relay';
|
|
195
|
+
if(window.packedMode==='cdn')document.querySelector('#connection-state').textContent='Multiplayer needs a hosted relay address. Use the game’s Host menu for solo play.';
|
|
196
|
+
const inviteParams=new URLSearchParams(location.search);
|
|
197
|
+
if(inviteParams.get('relay'))document.querySelector('#relay').value=inviteParams.get('relay');
|
|
198
|
+
const roomFromLink=inviteParams.get('room');
|
|
199
|
+
document.querySelector('#room').value=roomFromLink&&/^[A-Za-z0-9_-]{1,24}$/.test(roomFromLink)?roomFromLink:Array.from(crypto.getRandomValues(new Uint8Array(6)),b=>b.toString(16).padStart(2,'0')).join('');
|
|
200
|
+
function relayAddress(value){const address=new URL(value);if(address.protocol==='https:')address.protocol='wss:';else if(address.protocol==='http:')address.protocol='ws:';if(!['ws:','wss:'].includes(address.protocol))throw new Error('Enter the relay’s HTTPS or WSS address.');if(address.pathname==='/')address.pathname='/relay';return address.href}
|
|
201
|
+
document.querySelector('#invite-copy').onclick=async()=>{
|
|
202
|
+
try{const url=new URL(window.packedMode==='range'&&location.protocol==='https:'?location.href:'https://unpkg.com/@darkshadow2900/lethal-company-web@latest/index.html');url.search='';url.hash='';url.searchParams.set('relay',relayAddress(document.querySelector('#relay').value.trim()));url.searchParams.set('room',document.querySelector('#room').value.trim());const input=document.querySelector('#invite-link');input.hidden=false;input.value=url.href;input.select();try{await navigator.clipboard.writeText(url.href);document.querySelector('#connection-state').textContent='Invite copied. Keep the laptop relay running.'}catch{document.querySelector('#connection-state').textContent='Copy the invite link below.'}}catch(error){document.querySelector('#connection-state').textContent=error.message}
|
|
203
|
+
};
|
|
204
|
+
function send(method,value){if(instance)instance.SendMessage('BrowserBridge',method,typeof value==='string'?value:JSON.stringify(value))}
|
|
205
|
+
for(const [id,method] of [['host','Host'],['join','Join']])document.querySelector('#'+id).onclick=()=>{
|
|
206
|
+
try{
|
|
207
|
+
const url=relayAddress(document.querySelector('#relay').value.trim()),room=document.querySelector('#room').value.trim();
|
|
208
|
+
const address=new URL(url);
|
|
209
|
+
if(!['ws:','wss:'].includes(address.protocol))throw new Error('Enter a ws:// or wss:// relay address.');
|
|
210
|
+
if(!/^[A-Za-z0-9_-]{1,24}$/.test(room))throw new Error('Use 1–24 letters, numbers, underscores or hyphens for the room code.');
|
|
211
|
+
document.querySelector('#connection-state').textContent=method==='Host'?'Starting host…':'Connecting…';
|
|
212
|
+
send(method,{url,room,name:document.querySelector('#player-name').value});
|
|
213
|
+
}catch(error){document.querySelector('#connection-state').textContent=String(error.message||error)}
|
|
214
|
+
};
|
|
215
|
+
window.lethalWeb={
|
|
216
|
+
socket:null, receiver:'BrowserBridge',
|
|
217
|
+
connect(url,room,host,receiver){
|
|
218
|
+
this.receiver=receiver;this.isHost=host;this.room=room;this.hostAnnounced=false;voice.disconnected();clearInterval(this.heartbeat);if(this.socket)this.socket.close();const address=new URL(url);
|
|
219
|
+
address.searchParams.set('room',room);address.searchParams.set('role',host?'host':'client');
|
|
220
|
+
if(host)address.searchParams.set('wait_ready','1');
|
|
221
|
+
const socket=this.socket=new WebSocket(address);
|
|
222
|
+
this.heartbeat=setInterval(()=>{if(this.socket===socket&&socket.readyState===WebSocket.OPEN)socket.send(JSON.stringify({type:'ping'}))},20000);
|
|
223
|
+
socket.onopen=()=>{if(this.socket===socket)this.announceHostReady()};
|
|
224
|
+
socket.onmessage=e=>{if(this.socket!==socket)return;let message;try{message=JSON.parse(e.data)}catch{return}if(message.type==='voice'){voice.receive(message);return}if(message.type==='voice_leave'){voice.remove(message.id);return}if(message.type==='ready')voice.connected(message);if(message.type==='error')document.querySelector('#session').classList.add('open');send('RelayEvent',e.data)};
|
|
225
|
+
socket.onerror=()=>{if(this.socket!==socket)return;document.querySelector('#session').classList.add('open');document.querySelector('#connection-state').textContent='Cannot connect to the relay server.';send('RelayEvent',JSON.stringify({type:'error',message:'Cannot connect to relay'}))};
|
|
226
|
+
socket.onclose=()=>{if(this.socket===socket){voice.disconnected();clearInterval(this.heartbeat);document.querySelector('#session').classList.add('open');send('RelayEvent',JSON.stringify({type:'closed'}))}};
|
|
227
|
+
},
|
|
228
|
+
transmit(message){if(this.socket?.readyState===WebSocket.OPEN)this.socket.send(message)},
|
|
229
|
+
announceHostReady(){if(this.isHost&&!this.hostAnnounced&&playing&&this.socket?.readyState===WebSocket.OPEN){this.hostAnnounced=true;this.socket.send(JSON.stringify({type:'host_ready'}));this.status('Hosting room '+this.room)}},
|
|
230
|
+
close(){voice.disconnected();clearInterval(this.heartbeat);this.socket?.close();this.socket=null},
|
|
231
|
+
status(message){if(message.startsWith('Hosting room ')&&!this.hostAnnounced){document.querySelector('#connection-state').textContent='Starting room… wait until you are aboard the ship.';return}document.querySelector('#connection-state').textContent=message;if(message.startsWith('Hosting room ')||message.startsWith('Connected to room ')){document.querySelector('#session').classList.remove('open');canvas.focus()}},
|
|
232
|
+
gameplay(active){playing=active;if(active){this.announceHostReady();document.querySelector('#session').classList.remove('open')}touchMode(touch)},
|
|
233
|
+
asset(path){const normalized=path.replace(/^.*?StreamingAssets\//,'');return assets['streaming:'+normalized]||path}
|
|
234
|
+
};
|
|
235
|
+
const voice=window.lethalVoice=new window.LethalVoice({socket:()=>window.lethalWeb.socket,state:()=>window.gameProbe,probe:()=>send('Probe',''),level:value=>send('VoiceLevel',String(value))});
|
|
236
|
+
const move=document.querySelector('#move-pad'),stick=document.querySelector('#move-stick');let movePointer=null,lookPointer=null,lookLast=null;
|
|
237
|
+
function movement(e){const r=move.getBoundingClientRect(),radius=r.width*.36,dx=e.clientX-r.left-r.width/2,dy=e.clientY-r.top-r.height/2;
|
|
238
|
+
const length=Math.max(radius,Math.hypot(dx,dy));state.moveX=dx/length;state.moveY=-dy/length;stick.style.transform=`translate(${state.moveX*radius}px,${-state.moveY*radius}px)`}
|
|
239
|
+
move.onpointerdown=e=>{e.preventDefault();movePointer=e.pointerId;move.setPointerCapture(e.pointerId);movement(e)};
|
|
240
|
+
move.onpointermove=e=>{if(e.pointerId===movePointer)movement(e)};
|
|
241
|
+
move.onpointerup=move.onpointercancel=e=>{if(e.pointerId===movePointer){movePointer=null;state.moveX=state.moveY=0;stick.style.transform=''}};
|
|
242
|
+
const look=document.querySelector('#look-pad');look.onpointerdown=e=>{e.preventDefault();lookPointer=e.pointerId;lookLast=[e.clientX,e.clientY];look.setPointerCapture(e.pointerId)};
|
|
243
|
+
look.onpointermove=e=>{if(e.pointerId===lookPointer&&lookLast){state.lookX+=(e.clientX-lookLast[0])*3;state.lookY-=(e.clientY-lookLast[1])*3;lookLast=[e.clientX,e.clientY]}};
|
|
244
|
+
look.onpointerup=look.onpointercancel=e=>{if(e.pointerId===lookPointer){lookPointer=null;lookLast=null}};
|
|
245
|
+
document.querySelectorAll('[data-button]').forEach(button=>{
|
|
246
|
+
const flag=+button.dataset.button;
|
|
247
|
+
button.onpointerdown=e=>{e.preventDefault();button.setPointerCapture(e.pointerId);state.buttons|=flag;button.classList.add('pressed')};
|
|
248
|
+
button.onpointerup=button.onpointercancel=e=>{state.buttons&=~flag;button.classList.remove('pressed')};
|
|
249
|
+
});
|
|
250
|
+
window.addEventListener('blur',resetTouch);
|
|
251
|
+
document.addEventListener('visibilitychange',()=>{if(document.hidden)resetTouch()});
|
|
252
|
+
function tick(){if(touch&&instance){send('TouchState',state);state.lookX=state.lookY=0}requestAnimationFrame(tick)}requestAnimationFrame(tick);
|
|
253
|
+
async function unpack(key,metadata){
|
|
254
|
+
let position=0,partIndex=0,sourceError=null;
|
|
255
|
+
const compressed=new ReadableStream({async pull(controller){
|
|
256
|
+
if(metadata.parts){
|
|
257
|
+
if(partIndex===metadata.parts.length){controller.close();return}
|
|
258
|
+
try{
|
|
259
|
+
const part=metadata.parts[partIndex++],response=await fetch(part.url);
|
|
260
|
+
if(!response.ok)throw new Error('Cannot download '+key+' (HTTP '+response.status+').');
|
|
261
|
+
const bytes=new Uint8Array(await response.arrayBuffer());
|
|
262
|
+
if(bytes.length!==part.bytes)throw new Error('Incomplete download for '+key+'. Reload to retry.');
|
|
263
|
+
const digest=Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',bytes)),b=>b.toString(16).padStart(2,'0')).join('');
|
|
264
|
+
if(digest!==part.sha256)throw new Error('Download checksum failed for '+key+'. Reload to retry.');
|
|
265
|
+
position+=bytes.length;status.textContent='Loading '+key+'… '+Math.round(position/metadata.gzipBytes*100)+'%';
|
|
266
|
+
controller.enqueue(bytes);
|
|
267
|
+
}catch(error){sourceError=error;controller.error(error)}
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if(position===metadata.base64Bytes){controller.close();return}
|
|
271
|
+
try{
|
|
272
|
+
const length=Math.min(4*1024*1024,metadata.base64Bytes-position),start=metadata.offset+position;
|
|
273
|
+
let encoded;
|
|
274
|
+
if(localSource)encoded=await localSource.slice(start,start+length).text();
|
|
275
|
+
else{const response=await fetch(location.href,{headers:{Range:`bytes=${start}-${start+length-1}`}});if(response.status!==206)throw new Error('This server cannot read sections of the game file. Use the supplied laptop server.');encoded=await response.text()}
|
|
276
|
+
const raw=atob(encoded),bytes=new Uint8Array(raw.length);for(let n=0;n<raw.length;n++)bytes[n]=raw.charCodeAt(n);
|
|
277
|
+
position+=length;status.textContent='Unpacking '+key+'… '+Math.round(position/metadata.base64Bytes*100)+'%';controller.enqueue(bytes);
|
|
278
|
+
}catch(error){sourceError=error;controller.error(error)}
|
|
279
|
+
}});
|
|
280
|
+
const mime=key==='wasm'?'application/wasm':key==='loader'||key==='framework'?'text/javascript':/\.(mp4|m4v)$/i.test(key)?'video/mp4':'application/octet-stream';
|
|
281
|
+
let decoded;
|
|
282
|
+
try{decoded=await new Response(compressed.pipeThrough(new DecompressionStream('gzip'))).blob()}
|
|
283
|
+
catch(error){throw sourceError||error}
|
|
284
|
+
return URL.createObjectURL(new Blob([decoded],{type:mime}));
|
|
285
|
+
}
|
|
286
|
+
document.querySelector('#start').onclick=async()=>{
|
|
287
|
+
document.querySelector('#start').hidden=true;
|
|
288
|
+
try{
|
|
289
|
+
if(!window.DecompressionStream)throw new Error('This browser needs a newer version to unpack this game.');
|
|
290
|
+
if(window.packedMode==='range'&&location.protocol==='file:'&&!localSource){
|
|
291
|
+
status.textContent='Select this same HTML file so the browser can read its game data.';
|
|
292
|
+
localSource=await new Promise((resolve,reject)=>{const picker=document.createElement('input');picker.type='file';picker.accept='.html';picker.onchange=()=>picker.files.length?resolve(picker.files[0]):reject(new Error('Choose the game HTML file.'));picker.oncancel=()=>reject(new Error('No game file selected.'));picker.click()});
|
|
293
|
+
if(localSource.size!==window.packedFileBytes)throw new Error('Choose this game’s HTML file. The selected file has a different size.');
|
|
294
|
+
}
|
|
295
|
+
const entries=Object.entries(window.packedManifest);let count=0;
|
|
296
|
+
for(const [key,metadata]of entries){status.textContent='Unpacking game… '+Math.round(count/entries.length*100)+'%';assets[key]=await unpack(key,metadata);progress.value=++count/entries.length*.4}
|
|
297
|
+
window.packedManifest=null;
|
|
298
|
+
const originalFetch=window.fetch.bind(window);
|
|
299
|
+
window.fetch=(input,options)=>{const url=typeof input==='string'?input:input instanceof URL?input.href:input.url;const mapped=window.lethalWeb.asset(url);return originalFetch(mapped===url?input:mapped,options)};
|
|
300
|
+
await new Promise((resolve,reject)=>{const script=document.createElement('script');script.src=assets.loader;script.onload=resolve;script.onerror=reject;document.body.append(script)});
|
|
301
|
+
status.textContent='Starting game…';
|
|
302
|
+
instance=window.unityInstance=await createUnityInstance(canvas,{dataUrl:assets.data,frameworkUrl:assets.framework,codeUrl:assets.wasm,streamingAssetsUrl:'StreamingAssets',companyName:'LocalExperiments',productName:'Lethal Company Web Port',productVersion:'0.1',matchWebGLToCanvasSize:true,autoSyncPersistentDataPath:true,errorHandler:runtimeError,devicePixelRatio:Math.min(devicePixelRatio,2)},value=>progress.value=.4+value*.6);
|
|
303
|
+
for(const key of ['wasm','data']){URL.revokeObjectURL(assets[key]);delete assets[key]}
|
|
304
|
+
document.querySelector('#loading').hidden=true;canvas.focus();
|
|
305
|
+
if(inviteParams.get('relay')){const invitePoll=setInterval(()=>{if(!instance){clearInterval(invitePoll);return}instance.SendMessage('BrowserBridge','Probe','');if(window.gameProbe?.scene==='MainMenu'){clearInterval(invitePoll);document.querySelector('#session').classList.add('open')}},1000)}
|
|
306
|
+
}catch(error){console.error(error);status.textContent='Game could not start';document.querySelector('#load-error').textContent=String(error?.message||error);const retry=document.querySelector('#start');retry.hidden=false;retry.textContent='Reload and retry';retry.onclick=()=>location.reload()}
|
|
307
|
+
};
|
|
308
|
+
</script>
|
|
309
|
+
</html>
|
|
310
|
+
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@darkshadow2900/lethal-company-web",
|
|
3
|
-
"version": "0.1.1
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
|
-
"
|
|
5
|
+
"unpkg": "index.html",
|
|
6
|
+
"description": "Lethal Company browser port experiment.",
|
|
6
7
|
"files": [
|
|
7
|
-
"
|
|
8
|
+
"index.html"
|
|
8
9
|
],
|
|
9
10
|
"publishConfig": {
|
|
10
11
|
"access": "public"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|