quake2ts 0.0.52 → 0.0.53
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/apps/demo/dist/assets/index-BBC0sAl6.js +1 -0
- package/apps/demo/dist/index.html +20 -0
- package/apps/viewer/dist/browser/index.global.js +1 -1
- package/apps/viewer/dist/browser/index.global.js.map +1 -1
- package/apps/viewer/dist/cjs/index.cjs +2627 -414
- package/apps/viewer/dist/cjs/index.cjs.map +1 -1
- package/apps/viewer/dist/esm/index.js +2627 -414
- package/apps/viewer/dist/esm/index.js.map +1 -1
- package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -1
- package/apps/viewer/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -1
- package/packages/client/dist/browser/index.global.js +1 -1
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +2101 -108
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +2107 -108
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/client/dist/types/index.d.ts +3 -2
- package/packages/client/dist/types/index.d.ts.map +1 -1
- package/packages/client/dist/types/prediction.d.ts +3 -1
- package/packages/client/dist/types/prediction.d.ts.map +1 -1
- package/packages/engine/dist/browser/index.global.js +15 -15
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs +18 -2
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js +17 -2
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/host.d.ts +5 -2
- package/packages/engine/dist/types/host.d.ts.map +1 -1
- package/packages/engine/dist/types/index.d.ts +3 -2
- package/packages/engine/dist/types/index.d.ts.map +1 -1
- package/packages/engine/dist/types/render/camera.d.ts +8 -0
- package/packages/engine/dist/types/render/camera.d.ts.map +1 -0
- package/packages/engine/dist/types/render/draw.d.ts +9 -0
- package/packages/engine/dist/types/render/draw.d.ts.map +1 -0
- package/packages/game/dist/browser/index.global.js +1 -1
- package/packages/game/dist/browser/index.global.js.map +1 -1
- package/packages/game/dist/cjs/index.cjs +200 -3
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +200 -3
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/entities/spawn.d.ts +1 -0
- package/packages/game/dist/types/entities/spawn.d.ts.map +1 -1
- package/packages/game/dist/types/entities/system.d.ts +1 -0
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/index.d.ts +2 -1
- package/packages/game/dist/types/index.d.ts.map +1 -1
- package/packages/shared/dist/browser/index.global.js +1 -1
- package/packages/shared/dist/browser/index.global.js.map +1 -1
- package/packages/shared/dist/cjs/index.cjs +68 -0
- package/packages/shared/dist/cjs/index.cjs.map +1 -1
- package/packages/shared/dist/esm/index.js +67 -0
- package/packages/shared/dist/esm/index.js.map +1 -1
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/shared/dist/types/index.d.ts +2 -1
- package/packages/shared/dist/types/index.d.ts.map +1 -1
- package/packages/shared/dist/types/pmove/apply.d.ts +5 -0
- package/packages/shared/dist/types/pmove/apply.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/index.d.ts +18 -0
- package/packages/shared/dist/types/pmove/index.d.ts.map +1 -0
- package/packages/shared/dist/types/protocol/index.d.ts +6 -0
- package/packages/shared/dist/types/protocol/index.d.ts.map +1 -0
- package/packages/shared/dist/types/protocol/player-state.d.ts +11 -0
- package/packages/shared/dist/types/protocol/player-state.d.ts.map +1 -0
- package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const r of s)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function i(s){const r={};return s.integrity&&(r.integrity=s.integrity),s.referrerPolicy&&(r.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?r.credentials="include":s.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function n(s){if(s.ep)return;s.ep=!0;const r=i(s);fetch(s.href,r)}})();const ie=25,xe=5,we=()=>typeof performance<"u"?performance.now():Date.now(),be=t=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>t()):setTimeout(t,ie)};class ke{constructor(e,i={}){this.callbacks=e,this.accumulatorMs=0,this.frame=0,this.running=!1,this.tick=()=>{if(!this.running)return;const r=this.options.now(),a=this.lastTimeMs===void 0?0:r-this.lastTimeMs;this.lastTimeMs=r,this.advance(a,r),this.running&&this.options.schedule(this.tick)};const n=i.fixedDeltaMs??ie,s=i.maxSubSteps??xe;this.options={fixedDeltaMs:n,maxSubSteps:s,maxDeltaMs:i.maxDeltaMs??n*s,startTimeMs:i.startTimeMs,now:i.now??we,schedule:i.schedule??be}}start(){this.running||(this.running=!0,this.lastTimeMs=this.options.startTimeMs??this.options.now(),this.options.schedule(this.tick))}stop(){this.running=!1}pump(e){const i=(this.lastTimeMs??0)+e;this.lastTimeMs=i,this.advance(e,i)}isRunning(){return this.running}get frameNumber(){return this.frame}advance(e,i){var a,o;const n=Math.min(Math.max(e,0),this.options.maxDeltaMs);this.accumulatorMs=Math.min(this.accumulatorMs+n,this.options.fixedDeltaMs*this.options.maxSubSteps);let s=0;for(;this.accumulatorMs>=this.options.fixedDeltaMs&&s<this.options.maxSubSteps;)this.frame+=1,this.callbacks.simulate({frame:this.frame,deltaMs:this.options.fixedDeltaMs,nowMs:i}),this.accumulatorMs-=this.options.fixedDeltaMs,s+=1;const r=this.options.fixedDeltaMs===0?0:this.accumulatorMs/this.options.fixedDeltaMs;(o=(a=this.callbacks).render)==null||o.call(a,{alpha:r,nowMs:i,accumulatorMs:this.accumulatorMs,frame:this.frame})}}const ne={x:0,y:0,z:0};function L(t,e){return{x:t.x+e.x,y:t.y+e.y,z:t.z+e.z}}function I(t,e){return{x:t.x*e,y:t.y*e,z:t.z*e}}function N(t,e){return t.x*e.x+t.y*e.y+t.z*e.z}function Me(t){return N(t,t)}function P(t){return Math.sqrt(Me(t))}function se(t){const e=P(t);return e===0?t:I(t,1/e)}const re=0,ae=1,oe=2,Se=Math.PI/180;function U(t,e){switch(e){case re:return t.x;case ae:return t.y;case oe:default:return t.z}}function B(t){return t*Se}function K(t){const e=t%360;return e<0?360+e:e}function ce(t){const e=B(U(t,ae)),i=B(U(t,re)),n=B(U(t,oe)),s=Math.sin(e),r=Math.cos(e),a=Math.sin(i),o=Math.cos(i),c=Math.sin(n),h=Math.cos(n),m={x:o*r,y:o*s,z:-a},u={x:-c*a*r-h*-s,y:-c*a*s-h*r,z:-c*o},l={x:h*a*r-c*-s,y:h*a*s-c*r,z:h*o};return{forward:m,right:u,up:l}}const w=624,ze=397,Te=2567483615,_e=2147483648,Ae=2147483647,q=4294967296;class Ne{constructor(e=5489){this.state=new Uint32Array(w),this.index=w,this.seed(e)}seed(e){this.state[0]=e>>>0;for(let i=1;i<w;i++){const n=this.state[i-1]^this.state[i-1]>>>30,s=Math.imul(n>>>0,1812433253)+i;this.state[i]=s>>>0}this.index=w}nextUint32(){this.index>=w&&this.twist();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,e>>>0}twist(){for(let e=0;e<w;e++){const i=this.state[e]&_e|this.state[(e+1)%w]&Ae;let n=this.state[(e+ze)%w]^i>>>1;i&1&&(n^=Te),this.state[e]=n>>>0}this.index=0}getState(){return{index:this.index,state:Array.from(this.state)}}setState(e){if(e.state.length!==w)throw new Error(`Expected ${w} MT state values, received ${e.state.length}`);this.index=e.index,this.state=Uint32Array.from(e.state,i=>i>>>0)}}class Ee{constructor(e={}){this.mt=new Ne(e.seed)}frandom(){return this.mt.nextUint32()/q}frandomRange(e,i){return e+(i-e)*this.frandom()}frandomMax(e){return this.frandomRange(0,e)}crandom(){return this.frandomRange(-1,1)}crandomOpen(){const e=Number.EPSILON;return this.frandomRange(-1+e,1)}irandomUint32(){return this.mt.nextUint32()}irandomRange(e,i){if(i-e<=1)return e;const n=i-e,s=q-q%n;let r;do r=this.mt.nextUint32();while(r>=s);return e+r%n}irandom(e){return e<=0?0:this.irandomRange(0,e)}randomTimeRange(e,i){return i<=e?e:this.irandomRange(e,i)}randomTime(e){return this.irandom(e)}randomIndex(e){return this.irandom(e.length)}getState(){return{mt:this.mt.getState()}}setState(e){this.mt.setState(e.mt)}}function Ie(t){return new Ee(t)}var O=(t=>(t[t.None=0]="None",t[t.Feet=1]="Feet",t[t.Waist=2]="Waist",t[t.Under=3]="Under",t))(O||{}),b=(t=>(t[t.Ducked=1]="Ducked",t[t.JumpHeld=2]="JumpHeld",t[t.OnGround=4]="OnGround",t[t.TimeWaterJump=8]="TimeWaterJump",t[t.TimeLand=16]="TimeLand",t[t.TimeTeleport=32]="TimeTeleport",t[t.NoPositionalPrediction=64]="NoPositionalPrediction",t[t.OnLadder=128]="OnLadder",t[t.NoAngularPrediction=256]="NoAngularPrediction",t[t.IgnorePlayerCollision=512]="IgnorePlayerCollision",t[t.TimeTrick=1024]="TimeTrick",t))(b||{});function T(t,e){return(t&e)!==0}var le=(t=>(t[t.Normal=0]="Normal",t[t.Grapple=1]="Grapple",t[t.NoClip=2]="NoClip",t[t.Spectator=3]="Spectator",t[t.Dead=4]="Dead",t[t.Gib=5]="Gib",t[t.Freeze=6]="Freeze",t))(le||{});function he(t){const{velocity:e,frametime:i,onGround:n,groundIsSlick:s,onLadder:r,waterlevel:a,pmFriction:o,pmStopSpeed:c,pmWaterFriction:h}=t,m=P(e);if(m<1)return{x:0,y:0,z:e.z};let u=0;if(n&&!s||r){const f=m<c?c:m;u+=f*o*i}a>0&&!r&&(u+=m*h*a*i);let l=m-u;if(l<0&&(l=0),l===m)return e;const d=l/m;return I(e,d)}function W(t){const{velocity:e,wishdir:i,wishspeed:n,accel:s,frametime:r}=t,a=N(e,i),o=n-a;if(o<=0)return e;let c=s*r*n;return c>o&&(c=o),{x:e.x+i.x*c,y:e.y+i.y*c,z:e.z+i.z*c}}function Ce(t){const{velocity:e,wishdir:i,wishspeed:n,accel:s,frametime:r}=t,a=Math.min(n,30),o=N(e,i),c=a-o;if(c<=0)return e;let h=s*n*r;return h>c&&(h=c),{x:e.x+i.x*h,y:e.y+i.y*h,z:e.z+i.z*h}}function ue(t){const{forward:e,right:i,cmd:n,maxSpeed:s}=t;let r={x:e.x*n.forwardmove+i.x*n.sidemove,y:e.y*n.forwardmove+i.y*n.sidemove,z:0},a=P(r);if(a>s){const o=s/a;r=I(r,o),a=s}return{wishdir:a===0?r:se(r),wishspeed:a}}function de(t){const{forward:e,right:i,cmd:n,maxSpeed:s}=t;let r={x:e.x*n.forwardmove+i.x*n.sidemove,y:e.y*n.forwardmove+i.y*n.sidemove,z:0};n.upmove>10?r=L(r,{x:0,y:0,z:n.upmove}):n.upmove<-10?r=L(r,{x:0,y:0,z:n.upmove}):r=L(r,{x:0,y:0,z:10});let a=P(r);if(a>s){const o=s/a;r=I(r,o),a=s}return a*=.5,{wishdir:a===0?r:se(r),wishspeed:a}}function Re(t,e){return{x:t.x+e.x,y:t.y+e.y,z:t.z+e.z}}function De(t){return t>89&&t<180?89:t<271&&t>=180?271:t}function me(t){const{pmFlags:e,cmdAngles:i,deltaAngles:n}=t;let s;e&b.TimeTeleport?s={x:0,y:i.y+n.y,z:0}:(s=Re(i,n),s={...s,x:De(s.x)});const r=ce(s);return{viewangles:s,...r}}const _=.025,Le=(t,e)=>{const i={...t.origin};i.z-=.25;const n=e(t.origin,i);return{...t,onGround:n.fraction<1}},Oe=(t,e)=>{const i={...t.origin};return i.z+=t.mins.z+1,e(i)&33554432?{...t,waterLevel:1}:{...t,waterLevel:0}},Fe=(t,e,i,n)=>{let s={...t};s=Le(s,i),s=Oe(s,n);const{origin:r,velocity:a,onGround:o,waterLevel:c}=s,h=he({velocity:a,frametime:_,onGround:o,groundIsSlick:!1,onLadder:!1,waterlevel:c,pmFriction:6,pmStopSpeed:100,pmWaterFriction:1}),m=c>=2?de({forward:{x:1,y:0,z:0},right:{x:0,y:1,z:0},cmd:e,maxSpeed:320}):ue({forward:{x:1,y:0,z:0},right:{x:0,y:1,z:0},cmd:e,maxSpeed:320}),u=W({velocity:h,wishdir:m.wishdir,wishspeed:m.wishspeed,accel:o?10:1,frametime:_}),l=i(r,{x:r.x+u.x*_,y:r.y+u.y*_,z:r.z+u.z*_});return{...s,origin:l.endpos,velocity:u}};var G=1e-6,E=typeof Float32Array<"u"?Float32Array:Array;function $(){var t=new E(16);return E!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function Pe(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function Ue(t,e,i){var n=Math.sin(i),s=Math.cos(i),r=e[4],a=e[5],o=e[6],c=e[7],h=e[8],m=e[9],u=e[10],l=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=r*s+h*n,t[5]=a*s+m*n,t[6]=o*s+u*n,t[7]=c*s+l*n,t[8]=h*s-r*n,t[9]=m*s-a*n,t[10]=u*s-o*n,t[11]=l*s-c*n,t}function Be(t,e,i){var n=Math.sin(i),s=Math.cos(i),r=e[0],a=e[1],o=e[2],c=e[3],h=e[8],m=e[9],u=e[10],l=e[11];return e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=r*s-h*n,t[1]=a*s-m*n,t[2]=o*s-u*n,t[3]=c*s-l*n,t[8]=r*n+h*s,t[9]=a*n+m*s,t[10]=o*n+u*s,t[11]=c*n+l*s,t}function qe(t,e,i,n,s){var r=1/Math.tan(e/2);if(t[0]=r/i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=r,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,s!=null&&s!==1/0){var a=1/(n-s);t[10]=(s+n)*a,t[14]=2*s*n*a}else t[10]=-1,t[14]=-2*n;return t}var Ge=qe;function He(t,e,i,n){var s,r,a,o,c,h,m,u,l,d,f=e[0],p=e[1],v=e[2],y=n[0],x=n[1],C=n[2],Z=i[0],Y=i[1],J=i[2];return Math.abs(f-Z)<G&&Math.abs(p-Y)<G&&Math.abs(v-J)<G?Pe(t):(m=f-Z,u=p-Y,l=v-J,d=1/Math.sqrt(m*m+u*u+l*l),m*=d,u*=d,l*=d,s=x*l-C*u,r=C*m-y*l,a=y*u-x*m,d=Math.sqrt(s*s+r*r+a*a),d?(d=1/d,s*=d,r*=d,a*=d):(s=0,r=0,a=0),o=u*a-l*r,c=l*s-m*a,h=m*r-u*s,d=Math.sqrt(o*o+c*c+h*h),d?(d=1/d,o*=d,c*=d,h*=d):(o=0,c=0,h=0),t[0]=s,t[1]=o,t[2]=m,t[3]=0,t[4]=r,t[5]=c,t[6]=u,t[7]=0,t[8]=a,t[9]=h,t[10]=l,t[11]=0,t[12]=-(s*f+r*p+a*v),t[13]=-(o*f+c*p+h*v),t[14]=-(m*f+u*p+l*v),t[15]=1,t)}function j(){var t=new E(3);return E!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function H(t,e,i){var n=new E(3);return n[0]=t,n[1]=e,n[2]=i,n}function Ve(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t[2]=e[2]+i[2],t}function We(t,e,i){var n=e[0],s=e[1],r=e[2],a=i[3]*n+i[7]*s+i[11]*r+i[15];return a=a||1,t[0]=(i[0]*n+i[4]*s+i[8]*r+i[12])/a,t[1]=(i[1]*n+i[5]*s+i[9]*r+i[13])/a,t[2]=(i[2]*n+i[6]*s+i[10]*r+i[14])/a,t}(function(){var t=j();return function(e,i,n,s,r,a){var o,c;for(i||(i=3),n||(n=0),s?c=Math.min(s*i+n,e.length):c=e.length,o=n;o<c;o+=i)t[0]=e[o],t[1]=e[o+1],t[2]=e[o+2],r(t,t,a),e[o]=t[0],e[o+1]=t[1],e[o+2]=t[2];return e}})();const $e=(t,e,i,n,s,r,a)=>{const o=$();He(o,t,e,i);const c=$();return Ge(c,n,s,r,a),{position:t,viewMatrix:o,projectionMatrix:c}};function je(t){return{init(){t.trace({x:0,y:0,z:0},{x:0,y:0,z:0})},shutdown(){},createMainLoop(e,i){return new ke(e,i)}}}const Xe={pmFriction:6,pmStopSpeed:100,pmAccelerate:10,pmAirAccelerate:1,pmWaterAccelerate:4,pmWaterFriction:1,pmMaxSpeed:300,pmDuckSpeed:100,pmWaterSpeed:400,groundIsSlick:!1},Ze=800,z={x:0,y:0,z:0},Ye=250;function A(){return{origin:z,velocity:z,viewangles:z,pmFlags:b.OnGround,pmType:le.Normal,waterlevel:O.None,gravity:Ze,deltaAngles:z}}function Q(t){return t?{...A(),...t,origin:{...t.origin},velocity:{...t.velocity},viewangles:{...t.viewangles},deltaAngles:t.deltaAngles?{...t.deltaAngles}:z}:A()}function k(t,e,i){return t+(e-t)*i}function V(t,e,i){let n=K(e-t);return n>180&&(n-=360),K(t+n*i)}function Je(t,e,i){const n=Math.max(0,Math.min(i,1));return{origin:{x:k(t.origin.x,e.origin.x,n),y:k(t.origin.y,e.origin.y,n),z:k(t.origin.z,e.origin.z,n)},velocity:{x:k(t.velocity.x,e.velocity.x,n),y:k(t.velocity.y,e.velocity.y,n),z:k(t.velocity.z,e.velocity.z,n)},viewangles:{x:V(t.viewangles.x,e.viewangles.x,n),y:V(t.viewangles.y,e.viewangles.y,n),z:V(t.viewangles.z,e.viewangles.z,n)},pmFlags:e.pmFlags,pmType:e.pmType,waterlevel:e.waterlevel,gravity:e.gravity,deltaAngles:e.deltaAngles}}function Ke(t,e,i,n){const s=Math.min(Math.max(e.msec,0),Ye)/1e3,r=T(t.pmFlags,b.OnGround),a=T(t.pmFlags,b.OnLadder);let o=he({velocity:t.velocity,frametime:s,onGround:r,groundIsSlick:i.groundIsSlick,onLadder:a,waterlevel:t.waterlevel,pmFriction:i.pmFriction,pmStopSpeed:i.pmStopSpeed,pmWaterFriction:i.pmWaterFriction});const{viewangles:c,forward:h,right:m}=me({pmFlags:t.pmFlags,cmdAngles:e.angles,deltaAngles:t.deltaAngles??z}),u=t.waterlevel>O.None?de({forward:h,right:m,cmd:e,maxSpeed:i.pmWaterSpeed}):ue({forward:h,right:m,cmd:e,maxSpeed:i.pmMaxSpeed});if(t.waterlevel>O.None)o=W({velocity:o,wishdir:u.wishdir,wishspeed:u.wishspeed,accel:i.pmWaterAccelerate,frametime:s});else if(r||a){const f=T(t.pmFlags,b.Ducked)?i.pmDuckSpeed:i.pmMaxSpeed,p=u.wishspeed>f?{wishdir:u.wishdir,wishspeed:f}:u;o=W({velocity:o,wishdir:p.wishdir,wishspeed:p.wishspeed,accel:i.pmAccelerate,frametime:s})}else o=Ce({velocity:o,wishdir:u.wishdir,wishspeed:u.wishspeed,accel:i.pmAirAccelerate,frametime:s}),o={...o,z:o.z-t.gravity*s};const d=n(t.origin,L(t.origin,I(o,s))).endpos;return{...t,origin:d,velocity:o,viewangles:c}}class Qe{constructor(e,i={}){this.baseFrame={frame:0,timeMs:0,state:A()},this.commands=[],this.predicted=A(),this.settings={...Xe,...i},this.trace=e,this.predicted=this.baseFrame.state??A()}setAuthoritative(e){const i=Q(e.state);return this.baseFrame={...e,state:i},this.commands=this.commands.filter(n=>(n.serverFrame??Number.MAX_SAFE_INTEGER)>e.frame),this.recompute()}enqueueCommand(e){return this.commands.push(e),this.recompute()}getPredictedState(){return this.predicted}recompute(){let e=Q(this.baseFrame.state);for(const i of this.commands)e=Ke(e,i,this.settings,this.trace);return this.predicted=e,e}}const et={runPitch:.002,runRoll:.005,bobUp:.005,bobPitch:.002,bobRoll:.002,maxBobHeight:6,maxBobAngle:1.2};function tt(t){return{x:Math.max(-14,Math.min(14,t.x)),y:Math.max(-14,Math.min(14,t.y)),z:Math.max(-22,Math.min(30,t.z))}}function it(t,e,i){return e?t>210?i/400:t>100?i/800:i/1600:0}function nt(t,e,i,n,s){if(e<5)return{bobTime:0,bobCycle:0,bobCycleRun:0,bobFracSin:0};const r=it(e,n,s),a=t+r,c=T(i,b.Ducked)&&n?a*4:a;return{bobTime:a,bobCycle:Math.floor(c),bobCycleRun:Math.floor(a),bobFracSin:Math.abs(Math.sin(c*Math.PI))}}class st{constructor(e={}){this.bobTime=0,this.bobCycle=0,this.bobCycleRun=0,this.bobFracSin=0,this.settings={...et,...e}}addKick(e){e.durationMs<=0||(this.kick={...e,remainingMs:e.durationMs})}get last(){return this.lastSample}sample(e,i){const{forward:n,right:s}=ce(me({pmFlags:e.pmFlags,cmdAngles:e.viewangles,deltaAngles:e.deltaAngles??ne}).viewangles),r=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),a=T(e.pmFlags,b.OnGround),o=nt(this.bobTime,r,e.pmFlags,a,i);this.bobTime=o.bobTime,this.bobCycle=o.bobCycle,this.bobCycleRun=o.bobCycleRun,this.bobFracSin=o.bobFracSin;let c=N(e.velocity,n)*this.settings.runPitch,h=N(e.velocity,s)*this.settings.runRoll,m=this.bobFracSin*this.settings.bobPitch*r,u=this.bobFracSin*this.settings.bobRoll*r;T(e.pmFlags,b.Ducked)&&a&&(m*=6,u*=6),c+=Math.min(m,this.settings.maxBobAngle),u=Math.min(u,this.settings.maxBobAngle),this.bobCycle&1&&(u=-u),h+=u;const l=Math.min(this.bobFracSin*r*this.settings.bobUp,this.settings.maxBobHeight);let d=0,f=0;if(this.kick&&this.kick.remainingMs>0){const x=Math.max(0,Math.min(1,this.kick.remainingMs/this.kick.durationMs));d+=x*this.kick.pitch,f+=x*this.kick.roll,this.kick.remainingMs=Math.max(0,this.kick.remainingMs-i),this.kick.remainingMs===0&&(this.kick=void 0)}const y={angles:{x:c+d,y:0,z:h+f},offset:tt({x:0,y:0,z:l}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:r};return this.lastSample=y,y}}function rt(t){const e=new Qe(t.engine.trace),i=new st;let n,s,r;return{init(a){a!=null&&a.state&&e.setAuthoritative(a),t.engine.trace({x:0,y:0,z:0},{x:1,y:0,z:0})},predict(a){return e.enqueueCommand(a)},render(a){var h,m,u,l,d;(h=a.latest)!=null&&h.state&&(e.setAuthoritative(a.latest),a.latest),(m=a.previous)!=null&&m.state&&((u=a.latest)!=null&&u.state)?n=Je(a.previous.state,a.latest.state,a.alpha):n=((l=a.latest)==null?void 0:l.state)??((d=a.previous)==null?void 0:d.state)??e.getPredictedState();const o=a.latest&&a.previous?Math.max(0,a.latest.timeMs-a.previous.timeMs):0;if(s=i.sample(n,o),n){const{origin:f,viewangles:p}=n,v=H(f.x,f.y,f.z),y=$();Be(y,y,p.y*(Math.PI/180)),Ue(y,y,p.x*(Math.PI/180));const x=We(j(),H(1,0,0),y),C=Ve(j(),v,x);r=$e(v,C,H(0,0,1),90,4/3,.1,1e3)}return{}},shutdown(){n=void 0},get prediction(){return e},get lastRendered(){return n},get view(){return i},get lastView(){return s},get camera(){return r}}}var X=(t=>(t[t.Not=0]="Not",t[t.Trigger=1]="Trigger",t[t.BoundingBox=2]="BoundingBox",t[t.Bsp=3]="Bsp",t))(X||{}),fe=(t=>(t[t.None=0]="None",t[t.NoClient=1]="NoClient",t[t.DeadMonster=2]="DeadMonster",t[t.Monster=4]="Monster",t[t.Player=8]="Player",t[t.Bot=16]="Bot",t[t.NoBots=32]="NoBots",t[t.Respawning=64]="Respawning",t[t.Projectile=128]="Projectile",t[t.Instanced=256]="Instanced",t[t.Door=512]="Door",t[t.NoCull=1024]="NoCull",t[t.Hull=2048]="Hull",t))(fe||{}),pe=(t=>(t[t.Alive=0]="Alive",t[t.Dying=1]="Dying",t[t.Dead=2]="Dead",t[t.Respawnable=3]="Respawnable",t))(pe||{});const ge={...ne};function g(){return{...ge}}const ee=Object.freeze({aiflags:0,last_sighting:ge,trail_time:0,pausetime:0});class at{constructor(e){this.inUse=!1,this.freePending=!1,this.linkPrevious=null,this.linkNext=null,this.classname="",this.spawnflags=0,this.inventory={},this.origin=g(),this.old_origin=g(),this.velocity=g(),this.avelocity=g(),this.angles=g(),this.viewheight=0,this.mins=g(),this.maxs=g(),this.size=g(),this.mass=0,this.gravity=1,this.movetype=0,this.movedir=g(),this.modelindex=0,this.frame=0,this.skin=0,this.effects=0,this.renderfx=0,this.health=0,this.max_health=0,this.takedamage=!1,this.dmg=0,this.speed=0,this.deadflag=0,this.count=0,this.wait=0,this.delay=0,this.timestamp=0,this.sounds=0,this.noise_index=0,this.fly_sound_debounce_time=0,this.enemy=null,this.movetarget=null,this.target_ent=null,this.goalentity=null,this.ideal_yaw=0,this.yaw_speed=0,this.search_time=0,this.attack_finished_time=0,this.pain_finished_time=0,this.trail_time=0,this.groundentity=null,this.groundentity_linkcount=0,this.waterlevel=0,this.watertype=0,this.nextthink=0,this.activator=null,this.solid=0,this.flags=0,this.svflags=0,this.monsterinfo={...ee,last_sighting:g()},this.show_hostile=0,this.light_level=0,this.index=e}reset(){this.inUse=!1,this.freePending=!1,this.linkPrevious=null,this.linkNext=null,this.classname="",this.spawnflags=0,this.target=void 0,this.targetname=void 0,this.killtarget=void 0,this.team=void 0,this.message=void 0,this.pathtarget=void 0,this.model=void 0,this.item=void 0,this.inventory={},this.origin=g(),this.old_origin=g(),this.velocity=g(),this.avelocity=g(),this.angles=g(),this.viewheight=0,this.mins=g(),this.maxs=g(),this.size=g(),this.mass=0,this.gravity=1,this.movetype=0,this.movedir=g(),this.modelindex=0,this.frame=0,this.skin=0,this.effects=0,this.renderfx=0,this.health=0,this.max_health=0,this.takedamage=!1,this.dmg=0,this.speed=0,this.deadflag=0,this.count=0,this.wait=0,this.delay=0,this.timestamp=0,this.sounds=0,this.noise_index=0,this.fly_sound_debounce_time=0,this.enemy=null,this.movetarget=null,this.target_ent=null,this.goalentity=null,this.ideal_yaw=0,this.yaw_speed=0,this.search_time=0,this.attack_finished_time=0,this.pain_finished_time=0,this.trail_time=0,this.groundentity=null,this.groundentity_linkcount=0,this.waterlevel=0,this.watertype=0,this.nextthink=0,this.think=void 0,this.touch=void 0,this.use=void 0,this.pain=void 0,this.die=void 0,this.activator=null,this.solid=0,this.flags=0,this.svflags=0,this.monsterinfo={...ee,last_sighting:g()},this.combattarget=void 0,this.show_hostile=0,this.light_level=0}}const ve=[{name:"classname",type:"string",save:!0},{name:"spawnflags",type:"int",save:!0},{name:"target",type:"string",save:!0},{name:"targetname",type:"string",save:!0},{name:"killtarget",type:"string",save:!0},{name:"team",type:"string",save:!0},{name:"message",type:"string",save:!0},{name:"pathtarget",type:"string",save:!0},{name:"model",type:"string",save:!0},{name:"item",type:"string",save:!0},{name:"inventory",type:"inventory",save:!0},{name:"origin",type:"vec3",save:!0},{name:"old_origin",type:"vec3",save:!0},{name:"velocity",type:"vec3",save:!0},{name:"avelocity",type:"vec3",save:!0},{name:"angles",type:"vec3",save:!0},{name:"viewheight",type:"int",save:!0},{name:"mins",type:"vec3",save:!0},{name:"maxs",type:"vec3",save:!0},{name:"size",type:"vec3",save:!0},{name:"mass",type:"int",save:!0},{name:"gravity",type:"float",save:!0},{name:"movetype",type:"int",save:!0},{name:"movedir",type:"vec3",save:!0},{name:"modelindex",type:"int",save:!0},{name:"frame",type:"int",save:!0},{name:"skin",type:"int",save:!0},{name:"effects",type:"int",save:!0},{name:"renderfx",type:"int",save:!0},{name:"health",type:"int",save:!0},{name:"max_health",type:"int",save:!0},{name:"takedamage",type:"boolean",save:!0},{name:"dmg",type:"int",save:!0},{name:"speed",type:"float",save:!0},{name:"deadflag",type:"int",save:!0},{name:"count",type:"int",save:!0},{name:"wait",type:"float",save:!0},{name:"delay",type:"float",save:!0},{name:"timestamp",type:"float",save:!0},{name:"sounds",type:"int",save:!0},{name:"noise_index",type:"int",save:!0},{name:"fly_sound_debounce_time",type:"float",save:!0},{name:"enemy",type:"entity",save:!0},{name:"movetarget",type:"entity",save:!0},{name:"target_ent",type:"entity",save:!0},{name:"goalentity",type:"entity",save:!0},{name:"ideal_yaw",type:"float",save:!0},{name:"yaw_speed",type:"float",save:!0},{name:"search_time",type:"float",save:!0},{name:"attack_finished_time",type:"float",save:!0},{name:"pain_finished_time",type:"float",save:!0},{name:"trail_time",type:"float",save:!0},{name:"groundentity",type:"entity",save:!0},{name:"groundentity_linkcount",type:"int",save:!0},{name:"waterlevel",type:"int",save:!0},{name:"watertype",type:"int",save:!0},{name:"nextthink",type:"float",save:!0},{name:"solid",type:"int",save:!0},{name:"flags",type:"int",save:!0},{name:"svflags",type:"int",save:!0},{name:"think",type:"callback",save:!1},{name:"touch",type:"callback",save:!1},{name:"use",type:"callback",save:!1},{name:"pain",type:"callback",save:!1},{name:"die",type:"callback",save:!1}],ot=2048,M=0;class ct{constructor(e=ot){if(this.freeList=[],this.pendingFree=[],this.activeHead=null,e<1||!Number.isInteger(e))throw new Error("EntityPool requires a positive integer size");this.entities=new Array(e);for(let n=0;n<e;n+=1)this.entities[n]=new at(n),n!==M&&this.freeList.push(n);const i=this.entities[M];i.inUse=!0,i.classname="worldspawn",this.activeHead=i}get world(){return this.entities[M]}get capacity(){return this.entities.length}get activeCount(){let e=0;for(const i of this)e+=1;return e}[Symbol.iterator](){let e=this.activeHead;return{next:()=>{if(!e)return{done:!0,value:void 0};const i=e;return e=e.linkNext,{done:!1,value:i}}}}spawn(){const e=this.freeList.pop();if(e===void 0)throw new Error("No free entities available");const i=this.entities[e];return i.reset(),i.inUse=!0,this.link(i),i}deferFree(e){if(e.index===M)throw new Error("Cannot free world entity");!e.inUse||e.freePending||(this.unlink(e),e.inUse=!1,e.freePending=!0,this.pendingFree.push(e.index))}freeImmediate(e){if(e.index===M)throw new Error("Cannot free world entity");e.inUse&&(this.unlink(e),e.reset(),this.freeList.push(e.index))}flushFreeList(){if(this.pendingFree.length!==0){for(const e of this.pendingFree)this.entities[e].reset(),this.freeList.push(e);this.pendingFree.length=0}}createSnapshot(){const e=Array.from(this,i=>i.index);return{capacity:this.entities.length,activeOrder:e,freeList:[...this.freeList],pendingFree:[...this.pendingFree]}}restore(e){if(e.capacity!==this.entities.length)throw new Error(`Snapshot capacity ${e.capacity} does not match pool capacity ${this.entities.length}`);const i=new Set,n=(s,r)=>{if(s<0||s>=this.entities.length)throw new Error(`Invalid entity index ${s} in ${r}`);if(i.has(s))throw new Error(`Duplicate entity index ${s} in snapshot`);i.add(s)};for(const s of e.activeOrder)n(s,"activeOrder");for(const s of e.freeList)n(s,"freeList");for(const s of e.pendingFree)n(s,"pendingFree");this.activeHead=null,this.freeList.length=0,this.pendingFree.length=0;for(const s of this.entities)s.reset();for(let s=e.activeOrder.length-1;s>=0;s-=1){const r=this.entities[e.activeOrder[s]];r.inUse=!0,this.link(r)}for(const s of e.pendingFree){const r=this.entities[s];r.inUse=!1,r.freePending=!0,r.linkNext=null,r.linkPrevious=null,this.pendingFree.push(s)}for(const s of e.freeList){const r=this.entities[s];r.inUse=!1,r.freePending=!1,r.linkNext=null,r.linkPrevious=null,this.freeList.push(s)}if(!e.activeOrder.includes(M))throw new Error("Snapshot must include the world entity as active")}link(e){e.linkNext=this.activeHead,this.activeHead&&(this.activeHead.linkPrevious=e),this.activeHead=e,e.linkPrevious=null}unlink(e){e.linkPrevious&&(e.linkPrevious.linkNext=e.linkNext),e.linkNext&&(e.linkNext.linkPrevious=e.linkPrevious),this.activeHead===e&&(this.activeHead=e.linkNext),e.linkPrevious=null,e.linkNext=null}}class lt{constructor(){this.queue=[]}schedule(e,i){e.nextthink=i,this.queue.push({entity:e,time:i}),this.queue.sort((n,s)=>n.time===s.time?n.entity.index-s.entity.index:n.time-s.time)}cancel(e){if(this.queue.length!==0)for(let i=this.queue.length-1;i>=0;i-=1)this.queue[i].entity===e&&this.queue.splice(i,1)}snapshot(){return this.queue.map(({time:e,entity:i})=>({time:e,entityIndex:i.index}))}restore(e,i){this.queue.length=0;for(const n of e){const s=i(n.entityIndex);s&&this.schedule(s,n.time)}}runDueThinks(e){for(;this.queue.length>0;){const i=this.queue[0];if(i.time>e)break;this.queue.shift();const{entity:n,time:s}=i;!n.inUse||n.freePending||n.think&&n.nextthink===s&&n.think(n)}}}function R(t){return{min:{x:t.origin.x+t.mins.x,y:t.origin.y+t.mins.y,z:t.origin.z+t.mins.z},max:{x:t.origin.x+t.maxs.x,y:t.origin.y+t.maxs.y,z:t.origin.z+t.maxs.z}}}function te(t,e){return!(t.min.x>e.max.x||t.max.x<e.min.x||t.min.y>e.max.y||t.max.y<e.min.y||t.min.z>e.max.z||t.max.z<e.min.z)}const ye=ve.filter(t=>t.save||t.type==="callback"),ht=new Map(ye.map(t=>[t.name,t]));function ut(t){return[t.x,t.y,t.z]}function dt(t){const e=t;if(!Array.isArray(e)||e.length!==3)throw new Error("Invalid vec3 serialization");const[i,n,s]=e;return{x:i,y:n,z:s}}function S(t,e,i){t[e]=i}function mt(t){return{...t}}function ft(t){if(t===null||typeof t!="object"||Array.isArray(t))throw new Error("Invalid inventory serialization");const e={};for(const[i,n]of Object.entries(t))e[i]=Number(n);return e}class pt{constructor(e,i,n){if(this.targetNameIndex=new Map,this.random=Ie(),this.currentTimeSeconds=0,this.pool=new ct(i),this.thinkScheduler=new lt,this.engine=e,this.callbackToName=new Map,n)for(const[s,r]of n.entries())this.callbackToName.set(r,s)}get world(){return this.pool.world}get activeCount(){return this.pool.activeCount}get timeSeconds(){return this.currentTimeSeconds}forEachEntity(e){for(const i of this.pool)e(i)}find(e){for(const i of this.pool)if(e(i))return i}spawn(){return this.pool.spawn()}free(e){this.unregisterTarget(e),this.thinkScheduler.cancel(e),this.pool.deferFree(e)}freeImmediate(e){this.unregisterTarget(e),this.thinkScheduler.cancel(e),this.pool.freeImmediate(e)}sound(e,i,n,s,r,a){var o,c;(c=(o=this.engine).sound)==null||c.call(o,e,i,n,s,r,a)}scheduleThink(e,i){this.thinkScheduler.schedule(e,i)}beginFrame(e){this.currentTimeSeconds=e}finalizeSpawn(e){!e.inUse||e.freePending||this.registerTarget(e)}findByClassname(e){const i=[];for(const n of this.pool)n.classname===e&&n.inUse&&!n.freePending&&i.push(n);return i}findByTargetName(e){const i=this.targetNameIndex.get(e);return i?Array.from(i).filter(n=>n.inUse&&!n.freePending):[]}pickTarget(e){if(!e)return null;const i=this.findByTargetName(e);if(i.length===0)return null;const n=this.random.randomIndex(i);return i[n]??null}killBox(e){const i=R(e);for(const n of this.pool)n===e||n===this.pool.world||!n.inUse||n.freePending||n.solid===X.Not||n.svflags&fe.DeadMonster||te(i,R(n))&&(n.health=0,n.deadflag=pe.Dead,this.free(n))}useTargets(e,i=null){if(e.delay>0){const n=this.spawn();n.classname="DelayedUse",n.target=e.target,n.killtarget=e.killtarget,n.message=e.message,n.think=s=>{this.useTargetsImmediate(s,i??e),this.free(s)},this.scheduleThink(n,this.currentTimeSeconds+e.delay);return}this.useTargetsImmediate(e,i??e)}runFrame(){this.thinkScheduler.runDueThinks(this.currentTimeSeconds),this.runTouches(),this.pool.flushFreeList()}createSnapshot(){const e=[];for(const i of this.pool){const n={};for(const s of ye){const r=i[s.name];switch(s.type){case"vec3":n[s.name]=ut(r);break;case"entity":n[s.name]=(r==null?void 0:r.index)??null;break;case"inventory":n[s.name]=mt(r);break;case"callback":n[s.name]=r?this.callbackToName.get(r)??null:null;break;default:n[s.name]=r??null;break}}e.push({index:i.index,fields:n})}return{timeSeconds:this.currentTimeSeconds,pool:this.pool.createSnapshot(),entities:e,thinks:this.thinkScheduler.snapshot()}}restore(e,i){this.currentTimeSeconds=e.timeSeconds,this.pool.restore(e.pool);const n=new Map;for(const r of this.pool)n.set(r.index,r);const s=[];for(const r of e.entities){const a=n.get(r.index);if(a)for(const[o,c]of Object.entries(r.fields)){const h=ht.get(o);if(!(!h||c===void 0))switch(h.type){case"vec3":S(a,o,dt(c));break;case"entity":s.push({entity:a,name:h.name,targetIndex:c});break;case"inventory":S(a,o,ft(c));break;case"boolean":S(a,o,!!c);break;case"callback":if(c){const m=i==null?void 0:i.get(c);m&&S(a,o,m)}break;default:S(a,o,c);break}}}for(const r of s){const a=r.targetIndex===null?null:n.get(r.targetIndex)??null;S(r.entity,r.name,a)}this.thinkScheduler.restore(e.thinks,r=>n.get(r))}runTouches(){const e=this.pool.world,i=[];for(const n of this.pool)n!==e&&(!n.inUse||n.freePending||n.solid===X.Not||i.push(n));for(let n=0;n<i.length;n+=1){const s=i[n];let r=null;for(let a=n+1;a<i.length;a+=1){const o=i[a];if(!s.touch&&!o.touch)continue;r||(r=R(s));const c=R(o);te(r,c)&&(s.touch&&s.touch(s,o),o.touch&&o.touch(o,s))}}}registerTarget(e){if(!e.targetname)return;let i=this.targetNameIndex.get(e.targetname);i||(i=new Set,this.targetNameIndex.set(e.targetname,i)),i.add(e)}unregisterTarget(e){if(!e.targetname)return;const i=this.targetNameIndex.get(e.targetname);i&&(i.delete(e),i.size===0&&this.targetNameIndex.delete(e.targetname))}useTargetsImmediate(e,i){var n;if(e.target)for(const s of this.findByTargetName(e.target))s!==e&&((n=s.use)==null||n.call(s,s,e,i));if(e.killtarget)for(const s of this.findByTargetName(e.killtarget))s!==e&&this.free(s)}}new Map(ve.map(t=>[t.name,t]));function gt(t){return t.find(e=>e.classname==="info_player_start")}const vt=["prep","simulate","finish"];class yt{constructor(e){if(this.timeMs=0,this.frame=0,this.stageHandlers={prep:[],simulate:[],finish:[]},this.stageCounts={prep:0,simulate:0,finish:0},this.stageCompactionNeeded={prep:!1,simulate:!1,finish:!1},e)for(const i of vt){const n=e[i];n&&this.addStage(i,n)}}addStage(e,i){const n=this.stageHandlers[e];return n.push(i),this.stageCounts[e]+=1,()=>{const s=n.indexOf(i);s>=0&&n[s]&&(n[s]=void 0,this.stageCounts[e]-=1,this.stageCompactionNeeded[e]=!0)}}reset(e){this.timeMs=e,this.frame=0}advance(e){const i=this.timeMs;this.timeMs=i+e.deltaMs,this.frame=e.frame;const n={...e,timeMs:this.timeMs,previousTimeMs:i,deltaSeconds:e.deltaMs/1e3};if(this.runStage("prep",n),this.stageCounts.simulate===0)throw new Error("GameFrameLoop requires at least one simulate stage");return this.runStage("simulate",n),this.runStage("finish",n),n}runStage(e,i){const n=this.stageHandlers[e];for(let s=0;s<n.length;s+=1){const r=n[s];r&&r(i)}this.stageCompactionNeeded[e]&&this.compactStageHandlers(e)}compactStageHandlers(e){const i=this.stageHandlers[e];let n=0;for(let s=0;s<i.length;s+=1){const r=i[s];r&&(i[n]=r,n+=1)}i.length=n,this.stageCompactionNeeded[e]=!1}get time(){return this.timeMs}get frameNumber(){return this.frame}}const xt={frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0};class wt{constructor(){this.state=xt}start(e){const i=e/1e3;this.state={frameNumber:0,timeSeconds:i,previousTimeSeconds:i,deltaSeconds:0}}tick(e){return this.state={frameNumber:e.frame,timeSeconds:e.timeMs/1e3,previousTimeSeconds:e.previousTimeMs/1e3,deltaSeconds:e.deltaSeconds},this.state}get current(){return this.state}restore(e){this.state={...e}}}const D={x:0,y:0,z:0};function bt(t,e,i,n){const s=n.gravity,r=new wt,a=new yt,o=new pt(i);a.addStage("prep",l=>{r.tick(l),o.beginFrame(r.current.timeSeconds)}),a.addStage("simulate",({deltaSeconds:l})=>{h={x:h.x+s.x*l,y:h.y+s.y*l,z:h.z+s.z*l},c={x:c.x+h.x*l,y:c.y+h.y*l,z:c.z+h.z*l},o.runFrame()});let c={...D},h={...D};const m=l=>({frame:l,timeMs:a.time,state:{gravity:{...s},origin:{...c},velocity:{...h},level:{...r.current},entities:{activeCount:o.activeCount,worldClassname:o.world.classname}}}),u=l=>{a.reset(l),r.start(l),c={...D},h={...D},o.beginFrame(l/1e3),o.runFrame()};return{init(l){return u(l),m(0)},shutdown(){},spawnWorld(){const l=gt(o);if(l){const d=o.spawn();d.classname="player",d.origin={...l.origin},d.angles={...l.angles},d.health=100,d.mins={x:-16,y:-16,z:-24},d.maxs={x:16,y:16,z:32},o.finalizeSpawn(d),c={...d.origin}}},frame(l,d){const f=a.advance(l),p=o.find(v=>v.classname==="player");if(d&&p){const v={forwardmove:d.forwardmove,sidemove:d.sidemove,upmove:d.upmove,buttons:d.buttons},y={origin:p.origin,velocity:p.velocity,onGround:!1,waterLevel:0,mins:p.mins,maxs:p.maxs},x=Fe(y,v,t,e);p.origin=x.origin,p.velocity=x.velocity}return m(f.frame)},entities:o,sound(l,d,f,p,v,y){o.sound(l,d,f,p,v,y)},centerprintf(l,d){var f;(f=i.centerprintf)==null||f.call(i,l,d)},get time(){return r.current.timeSeconds}}}const F=je({}),kt=bt(F.trace,F.pointContents,{gravity:{x:0,y:0,z:-800}}),Mt=rt({engine:F}),St=F.createMainLoop({simulate:t=>{kt.frame(t)},render:t=>{Mt.render(t)}});St.start();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>Quake II TS</title>
|
|
5
|
+
<style>
|
|
6
|
+
body {
|
|
7
|
+
margin: 0;
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
#canvas {
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 100%;
|
|
13
|
+
}
|
|
14
|
+
</style>
|
|
15
|
+
<script type="module" crossorigin src="/assets/index-BBC0sAl6.js"></script>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<canvas id="canvas"></canvas>
|
|
19
|
+
</body>
|
|
20
|
+
</html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Quake2=(()=>{var ae=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var yt=Object.prototype.hasOwnProperty;var vt=(e,t)=>{for(var n in t)ae(e,n,{get:t[n],enumerable:!0})},gt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of pt(t))!yt.call(e,i)&&i!==n&&ae(e,i,{get:()=>t[i],enumerable:!(r=ft(t,i))||r.enumerable});return e};var xt=e=>gt(ae({},"__esModule",{value:!0}),e);var Hr={};vt(Hr,{bootstrapViewer:()=>Wr});var wt={x:0,y:0,z:0},Xr=Math.PI/180;function I(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function U(e,t){return{x:e.x*t,y:e.y*t,z:e.z*t}}function D(e,t){return e.x*t.x+e.y*t.y+e.z*t.z}function St(e){return D(e,e)}function G(e){return Math.sqrt(St(e))}function Ce(e){let t=G(e);return t===0?e:U(e,1/t)}var Pe=0,De=1,Ue=2,_t=Math.PI/180,Yr=180/Math.PI;function ce(e,t){switch(t){case Pe:return e.x;case De:return e.y;case Ue:default:return e.z}}function ue(e){return e*_t}function be(e){let t=e%360;return t<0?360+t:t}function Fe(e){let t=ue(ce(e,De)),n=ue(ce(e,Pe)),r=ue(ce(e,Ue)),i=Math.sin(t),o=Math.cos(t),s=Math.sin(n),a=Math.cos(n),u=Math.sin(r),l=Math.cos(r),c={x:a*o,y:a*i,z:-s},m={x:-u*s*o-l*-i,y:-u*s*i-l*o,z:-u*a},f={x:l*s*o-u*-i,y:l*s*i-u*o,z:l*a};return{forward:c,right:m,up:f}}var y=1,E=2;var de=8,me=16,Et=32;var Tt=16384;var V=65536,Ie=1<<17,At=1<<18,zt=1<<19,Nt=1<<20,Rt=1<<21,Lt=1<<22,Mt=1<<23,$r=1<<24,W=1<<25,bt=1<<26,jr=1<<27,qr=1<<28,Jr=1<<29,H=1<<30,Zr=1<<31;var Qr=1<<25,ei=1<<28,ti=1<<29,ni=1<<30,ri=1<<31,ii=y|E,si=y|V|E|W|H,oi=y|V|E,ai=y|Ie|E|W|H,ci=Et|de|me,ui=y|me|de,Ot=y|W|H|E|bt,li=At|zt|Nt|Rt|Lt|Mt,hi=y|de|me|W|H,di=y|V|E,mi=y|E,fi=y|V|E|Ie,pi=Ot|Tt,yi=Number.MAX_SAFE_INTEGER-1,Be=256,kt=256,Ct=8192,Pt=2048,Dt=512,Ut=256,Ft=Be*2,It=256,le=32,Ge=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+Ct]="Sounds",e[e.Images=e.Sounds+Pt]="Images",e[e.Lights=e.Images+Dt]="Lights",e[e.ShadowLights=e.Lights+kt]="ShadowLights",e[e.Items=e.ShadowLights+It]="Items",e[e.PlayerSkins=e.Items+Ut]="PlayerSkins",e[e.General=e.PlayerSkins+Be]="General",e[e.WheelWeapons=e.General+Ft]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+le]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+le]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+le]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(Ge||{}),vi=Ge.MaxConfigStrings,B=(e=>(e[e.None=0]="None",e[e.Feet=1]="Feet",e[e.Waist=2]="Waist",e[e.Under=3]="Under",e))(B||{}),_=(e=>(e[e.Ducked=1]="Ducked",e[e.JumpHeld=2]="JumpHeld",e[e.OnGround=4]="OnGround",e[e.TimeWaterJump=8]="TimeWaterJump",e[e.TimeLand=16]="TimeLand",e[e.TimeTeleport=32]="TimeTeleport",e[e.NoPositionalPrediction=64]="NoPositionalPrediction",e[e.OnLadder=128]="OnLadder",e[e.NoAngularPrediction=256]="NoAngularPrediction",e[e.IgnorePlayerCollision=512]="IgnorePlayerCollision",e[e.TimeTrick=1024]="TimeTrick",e))(_||{});function b(e,t){return(e&t)!==0}var Ve=(e=>(e[e.Normal=0]="Normal",e[e.Grapple=1]="Grapple",e[e.NoClip=2]="NoClip",e[e.Spectator=3]="Spectator",e[e.Dead=4]="Dead",e[e.Gib=5]="Gib",e[e.Freeze=6]="Freeze",e))(Ve||{}),L=(e=>(e[e.None=0]="None",e[e.Attack=1]="Attack",e[e.Use=2]="Use",e[e.Holster=4]="Holster",e[e.Jump=8]="Jump",e[e.Crouch=16]="Crouch",e[e.Any=128]="Any",e))(L||{});function Bt(e){let{velocity:t,frametime:n,onGround:r,groundIsSlick:i,onLadder:o,waterlevel:s,pmFriction:a,pmStopSpeed:u,pmWaterFriction:l}=e,c=G(t);if(c<1)return{x:0,y:0,z:t.z};let m=0;if(r&&!i||o){let N=c<u?u:c;m+=N*a*n}s>0&&!o&&(m+=c*l*s*n);let f=c-m;if(f<0&&(f=0),f===c)return t;let S=f/c;return U(t,S)}function Oe(e){let{velocity:t,wishdir:n,wishspeed:r,accel:i,frametime:o}=e,s=D(t,n),a=r-s;if(a<=0)return t;let u=i*o*r;return u>a&&(u=a),{x:t.x+n.x*u,y:t.y+n.y*u,z:t.z+n.z*u}}function Gt(e){let{velocity:t,wishdir:n,wishspeed:r,accel:i,frametime:o}=e,s=Math.min(r,30),a=D(t,n),u=s-a;if(u<=0)return t;let l=i*r*o;return l>u&&(l=u),{x:t.x+n.x*l,y:t.y+n.y*l,z:t.z+n.z*l}}function Vt(e){let{forward:t,right:n,cmd:r,maxSpeed:i}=e,o={x:t.x*r.forwardmove+n.x*r.sidemove,y:t.y*r.forwardmove+n.y*r.sidemove,z:0},s=G(o);if(s>i){let a=i/s;o=U(o,a),s=i}return{wishdir:s===0?o:Ce(o),wishspeed:s}}function Wt(e){let{forward:t,right:n,cmd:r,maxSpeed:i}=e,o={x:t.x*r.forwardmove+n.x*r.sidemove,y:t.y*r.forwardmove+n.y*r.sidemove,z:0};r.upmove>10?o=I(o,{x:0,y:0,z:r.upmove}):r.upmove<-10?o=I(o,{x:0,y:0,z:r.upmove}):o=I(o,{x:0,y:0,z:10});let s=G(o);if(s>i){let a=i/s;o=U(o,a),s=i}return s*=.5,{wishdir:s===0?o:Ce(o),wishspeed:s}}function Ht(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Kt(e){return e>89&&e<180?89:e<271&&e>=180?271:e}function We(e){let{pmFlags:t,cmdAngles:n,deltaAngles:r}=e,i;(t&32)!==0?i={x:0,y:n.y+r.y,z:0}:(i=Ht(n,r),i={...i,x:Kt(i.x)});let o=Fe(i);return{viewangles:i,...o}}var Xt={pmFriction:6,pmStopSpeed:100,pmAccelerate:10,pmAirAccelerate:1,pmWaterAccelerate:4,pmWaterFriction:1,pmMaxSpeed:300,pmDuckSpeed:100,pmWaterSpeed:400,groundIsSlick:!1},Yt=800,M={x:0,y:0,z:0},$t=250;function P(){return{origin:M,velocity:M,viewangles:M,pmFlags:_.OnGround,pmType:Ve.Normal,waterlevel:B.None,gravity:Yt,deltaAngles:M}}function ke(e){return e?{...P(),...e,origin:{...e.origin},velocity:{...e.velocity},viewangles:{...e.viewangles},deltaAngles:e.deltaAngles?{...e.deltaAngles}:M}:P()}function R(e,t,n){return e+(t-e)*n}function he(e,t,n){let r=be(t-e);return r>180&&(r-=360),be(e+r*n)}function jt(e,t,n){let r=Math.max(0,Math.min(n,1));return{origin:{x:R(e.origin.x,t.origin.x,r),y:R(e.origin.y,t.origin.y,r),z:R(e.origin.z,t.origin.z,r)},velocity:{x:R(e.velocity.x,t.velocity.x,r),y:R(e.velocity.y,t.velocity.y,r),z:R(e.velocity.z,t.velocity.z,r)},viewangles:{x:he(e.viewangles.x,t.viewangles.x,r),y:he(e.viewangles.y,t.viewangles.y,r),z:he(e.viewangles.z,t.viewangles.z,r)},pmFlags:t.pmFlags,pmType:t.pmType,waterlevel:t.waterlevel,gravity:t.gravity,deltaAngles:t.deltaAngles}}function qt(e,t,n){let r=Math.min(Math.max(t.msec,0),$t)/1e3,i=b(e.pmFlags,_.OnGround),o=b(e.pmFlags,_.OnLadder),s=Bt({velocity:e.velocity,frametime:r,onGround:i,groundIsSlick:n.groundIsSlick,onLadder:o,waterlevel:e.waterlevel,pmFriction:n.pmFriction,pmStopSpeed:n.pmStopSpeed,pmWaterFriction:n.pmWaterFriction}),{viewangles:a,forward:u,right:l}=We({pmFlags:e.pmFlags,cmdAngles:t.angles,deltaAngles:e.deltaAngles??M}),c=e.waterlevel>B.None?Wt({forward:u,right:l,cmd:t,maxSpeed:n.pmWaterSpeed}):Vt({forward:u,right:l,cmd:t,maxSpeed:n.pmMaxSpeed});if(e.waterlevel>B.None)s=Oe({velocity:s,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmWaterAccelerate,frametime:r});else if(i||o){let S=b(e.pmFlags,_.Ducked)?n.pmDuckSpeed:n.pmMaxSpeed,N=c.wishspeed>S?{wishdir:c.wishdir,wishspeed:S}:c;s=Oe({velocity:s,wishdir:N.wishdir,wishspeed:N.wishspeed,accel:n.pmAccelerate,frametime:r})}else s=Gt({velocity:s,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmAirAccelerate,frametime:r}),s={...s,z:s.z-e.gravity*r};let m=U(s,r),f=I(e.origin,m);return{...e,origin:f,velocity:s,viewangles:a}}var Jt=class{constructor(e={}){this.baseFrame={frame:0,timeMs:0,state:P()},this.commands=[],this.predicted=P(),this.settings={...Xt,...e},this.predicted=this.baseFrame.state??P()}setAuthoritative(e){let t=ke(e.state);return this.baseFrame={...e,state:t},this.commands=this.commands.filter(n=>(n.serverFrame??Number.MAX_SAFE_INTEGER)>e.frame),this.recompute()}enqueueCommand(e){return this.commands.push(e),this.recompute()}getPredictedState(){return this.predicted}recompute(){let e=ke(this.baseFrame.state);for(let t of this.commands)e=qt(e,t,this.settings);return this.predicted=e,e}},Zt={runPitch:.002,runRoll:.005,bobUp:.005,bobPitch:.002,bobRoll:.002,maxBobHeight:6,maxBobAngle:1.2};function Qt(e){return{x:Math.max(-14,Math.min(14,e.x)),y:Math.max(-14,Math.min(14,e.y)),z:Math.max(-22,Math.min(30,e.z))}}function en(e,t,n){return t?e>210?n/400:e>100?n/800:n/1600:0}function tn(e,t,n,r,i){if(t<5)return{bobTime:0,bobCycle:0,bobCycleRun:0,bobFracSin:0};let o=en(t,r,i),s=e+o,u=b(n,_.Ducked)&&r?s*4:s;return{bobTime:s,bobCycle:Math.floor(u),bobCycleRun:Math.floor(s),bobFracSin:Math.abs(Math.sin(u*Math.PI))}}var nn=class{constructor(e={}){this.bobTime=0,this.bobCycle=0,this.bobCycleRun=0,this.bobFracSin=0,this.settings={...Zt,...e}}addKick(e){e.durationMs<=0||(this.kick={...e,remainingMs:e.durationMs})}get last(){return this.lastSample}sample(e,t){let{forward:n,right:r}=Fe(We({pmFlags:e.pmFlags,cmdAngles:e.viewangles,deltaAngles:e.deltaAngles??wt}).viewangles),i=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),o=b(e.pmFlags,_.OnGround),s=tn(this.bobTime,i,e.pmFlags,o,t);this.bobTime=s.bobTime,this.bobCycle=s.bobCycle,this.bobCycleRun=s.bobCycleRun,this.bobFracSin=s.bobFracSin;let a=D(e.velocity,n)*this.settings.runPitch,u=D(e.velocity,r)*this.settings.runRoll,l=this.bobFracSin*this.settings.bobPitch*i,c=this.bobFracSin*this.settings.bobRoll*i;b(e.pmFlags,_.Ducked)&&o&&(l*=6,c*=6),a+=Math.min(l,this.settings.maxBobAngle),c=Math.min(c,this.settings.maxBobAngle),this.bobCycle&1&&(c=-c),u+=c;let m=Math.min(this.bobFracSin*i*this.settings.bobUp,this.settings.maxBobHeight),f=0,S=0;if(this.kick&&this.kick.remainingMs>0){let Me=Math.max(0,Math.min(1,this.kick.remainingMs/this.kick.durationMs));f+=Me*this.kick.pitch,S+=Me*this.kick.roll,this.kick.remainingMs=Math.max(0,this.kick.remainingMs-t),this.kick.remainingMs===0&&(this.kick=void 0)}let Le={angles:{x:a+f,y:0,z:u+S},offset:Qt({x:0,y:0,z:m}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:i};return this.lastSample=Le,Le}};function rn(e){return e.trim().toLowerCase()}var He=(e=>(e.Forward="+forward",e.Back="+back",e.MoveLeft="+moveleft",e.MoveRight="+moveright",e.MoveUp="+moveup",e.MoveDown="+movedown",e.Jump="+jump",e.Crouch="+crouch",e.Attack="+attack",e.Use="+use",e.Holster="+holster",e.TurnLeft="+left",e.TurnRight="+right",e.LookUp="+lookup",e.LookDown="+lookdown",e.SpeedModifier="+speed",e.Zoom="+zoom",e))(He||{}),gi={"+attack":L.Attack,"+use":L.Use,"+holster":L.Holster,"+jump":L.Jump,"+crouch":L.Crouch},xi=new Map(Object.values(He).map(e=>[rn(e),e]));function Ke(e){let t=new Jt,n=new nn,r,i,o;return{init(s){r=s,s?.state&&t.setAuthoritative(s),e.engine.trace({x:0,y:0,z:0},{x:1,y:0,z:0})},predict(s){return t.enqueueCommand(s)},render(s){s.latest?.state&&(t.setAuthoritative(s.latest),r=s.latest),s.previous?.state&&s.latest?.state?i=jt(s.previous.state,s.latest.state,s.alpha):i=s.latest?.state??s.previous?.state??t.getPredictedState();let a=s.latest&&s.previous?Math.max(0,s.latest.timeMs-s.previous.timeMs):0;o=n.sample(i,a)},shutdown(){r=void 0,i=void 0},get prediction(){return t},get lastRendered(){return i},get view(){return n},get lastView(){return o}}}var Xe=25,sn=5,on=()=>typeof performance<"u"?performance.now():Date.now(),an=e=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>e()):setTimeout(e,Xe)},Ye=class{constructor(e,t={}){this.callbacks=e,this.accumulatorMs=0,this.frame=0,this.running=!1,this.tick=()=>{if(!this.running)return;let i=this.options.now(),o=this.lastTimeMs===void 0?0:i-this.lastTimeMs;this.lastTimeMs=i,this.advance(o,i),this.running&&this.options.schedule(this.tick)};let n=t.fixedDeltaMs??Xe,r=t.maxSubSteps??sn;this.options={fixedDeltaMs:n,maxSubSteps:r,maxDeltaMs:t.maxDeltaMs??n*r,startTimeMs:t.startTimeMs,now:t.now??on,schedule:t.schedule??an}}start(){this.running||(this.running=!0,this.lastTimeMs=this.options.startTimeMs??this.options.now(),this.options.schedule(this.tick))}stop(){this.running=!1}pump(e){let t=(this.lastTimeMs??0)+e;this.lastTimeMs=t,this.advance(e,t)}isRunning(){return this.running}get frameNumber(){return this.frame}advance(e,t){let n=Math.min(Math.max(e,0),this.options.maxDeltaMs);this.accumulatorMs=Math.min(this.accumulatorMs+n,this.options.fixedDeltaMs*this.options.maxSubSteps);let r=0;for(;this.accumulatorMs>=this.options.fixedDeltaMs&&r<this.options.maxSubSteps;)this.frame+=1,this.callbacks.simulate({frame:this.frame,deltaMs:this.options.fixedDeltaMs,nowMs:t}),this.accumulatorMs-=this.options.fixedDeltaMs,r+=1;let i=this.options.fixedDeltaMs===0?0:this.accumulatorMs/this.options.fixedDeltaMs;this.callbacks.render?.({alpha:i,nowMs:t,accumulatorMs:this.accumulatorMs,frame:this.frame})}},cn=class{constructor(e,t,n={}){this.game=e,this.client=t,this.started=!1,this.stepSimulation=i=>{this.previousFrame=this.latestFrame,this.latestFrame=this.game.frame(i)},this.renderClient=i=>{this.client&&this.client.render({...i,previous:this.previousFrame,latest:this.latestFrame})};let r=n.loop?.now?.()??Date.now();this.startTimeMs=n.startTimeMs??n.loop?.startTimeMs??r,this.loop=new Ye({simulate:this.stepSimulation,render:this.renderClient},{...n.loop,startTimeMs:this.startTimeMs})}start(){this.started||(this.latestFrame=this.game.init(this.startTimeMs)??this.latestFrame,this.client?.init(this.latestFrame),this.started=!0,this.loop.start())}stop(){this.started&&(this.loop.stop(),this.client?.shutdown(),this.game.shutdown(),this.previousFrame=void 0,this.latestFrame=void 0,this.started=!1)}pump(e){this.loop.pump(e)}getLatestFrame(){return this.latestFrame}isRunning(){return this.loop.isRunning()}};var Ei=Math.PI/180;var Ti=Math.PI/180,Ai=180/Math.PI;var v=1,T=2;var ve=8,ge=16,un=32;var ln=16384;var K=65536,$e=1<<17,hn=1<<18,dn=1<<19,mn=1<<20,fn=1<<21,pn=1<<22,yn=1<<23,zi=1<<24,X=1<<25,vn=1<<26,Ni=1<<27,Ri=1<<28,Li=1<<29,Y=1<<30,Mi=1<<31;var bi=1<<25,Oi=1<<28,ki=1<<29,Ci=1<<30,Pi=1<<31,Di=v|T,Ui=v|K|T|X|Y,Fi=v|K|T,Ii=v|$e|T|X|Y,Bi=un|ve|ge,Gi=v|ge|ve,gn=v|X|Y|T|vn,Vi=hn|dn|mn|fn|pn|yn,Wi=v|ve|ge|X|Y,Hi=v|K|T,Ki=v|T,Xi=v|K|T|$e,Yi=gn|ln,$i=Number.MAX_SAFE_INTEGER-1;var je=256,xn=256,wn=8192,Sn=2048,_n=512,En=256,Tn=je*2,An=256,fe=32;var qe=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+wn]="Sounds",e[e.Images=e.Sounds+Sn]="Images",e[e.Lights=e.Images+_n]="Lights",e[e.ShadowLights=e.Lights+xn]="ShadowLights",e[e.Items=e.ShadowLights+An]="Items",e[e.PlayerSkins=e.Items+En]="PlayerSkins",e[e.General=e.PlayerSkins+je]="General",e[e.WheelWeapons=e.General+Tn]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+fe]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+fe]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+fe]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(qe||{}),ji=qe.MaxConfigStrings;var zn=class{constructor(e,t){this.engine=e,this.host=t,this.started=!1}start(){this.started||(this.engine.init(),this.host.start(),this.started=!0)}stop(){this.started&&(this.host.stop(),this.engine.shutdown(),this.started=!1)}pump(e){this.host.pump(e)}getLatestFrame(){return this.host.getLatestFrame()}isRunning(){return this.started&&this.host.isRunning()}};function Je(e,t,n,r){return new zn(e,new cn(t,n,r))}function Nn(){let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let n=t;for(let r=0;r<8;r+=1)n=(n&1)!==0?3988292384^n>>>1:n>>>1;e[t]=n>>>0}return e}var qi=Nn();var Ji=Object.freeze([{name:"pak0.pak",checksum:2378051181,description:"Base game assets"},{name:"pak0.pak@baseq2",checksum:2378051181,description:"Base game assets (baseq2)"},{name:"pak0.pak@rogue",checksum:3373211245,description:"Ground Zero (rogue) mission pack"},{name:"pak0.pak@xatrix",checksum:1358269824,description:"The Reckoning (xatrix) mission pack"}]);var ye=4,pe=7*ye,Zi=[{index:0,size:3,type:5126,stride:pe,offset:0},{index:1,size:2,type:5126,stride:pe,offset:3*ye},{index:2,size:2,type:5126,stride:pe,offset:5*ye}];var Qi=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1]);function Ze(e){return{init(){e.trace({x:0,y:0,z:0},{x:0,y:0,z:0})},shutdown(){},createMainLoop(t,n){return new Ye(t,n)}}}var Rn={x:0,y:0,z:0},is=Math.PI/180;var ss=Math.PI/180,os=180/Math.PI;var g=624,Ln=397,Mn=2567483615,bn=2147483648,On=2147483647,xe=4294967296,kn=class{constructor(e=5489){this.state=new Uint32Array(g),this.index=g,this.seed(e)}seed(e){this.state[0]=e>>>0;for(let t=1;t<g;t++){let n=this.state[t-1]^this.state[t-1]>>>30,r=Math.imul(n>>>0,1812433253)+t;this.state[t]=r>>>0}this.index=g}nextUint32(){this.index>=g&&this.twist();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,e>>>0}twist(){for(let e=0;e<g;e++){let t=this.state[e]&bn|this.state[(e+1)%g]&On,n=this.state[(e+Ln)%g]^t>>>1;(t&1)!==0&&(n^=Mn),this.state[e]=n>>>0}this.index=0}getState(){return{index:this.index,state:Array.from(this.state)}}setState(e){if(e.state.length!==g)throw new Error(`Expected ${g} MT state values, received ${e.state.length}`);this.index=e.index,this.state=Uint32Array.from(e.state,t=>t>>>0)}},nt=class{constructor(e={}){this.mt=new kn(e.seed)}frandom(){return this.mt.nextUint32()/xe}frandomRange(e,t){return e+(t-e)*this.frandom()}frandomMax(e){return this.frandomRange(0,e)}crandom(){return this.frandomRange(-1,1)}crandomOpen(){let e=Number.EPSILON;return this.frandomRange(-1+e,1)}irandomUint32(){return this.mt.nextUint32()}irandomRange(e,t){if(t-e<=1)return e;let n=t-e,r=xe-xe%n,i;do i=this.mt.nextUint32();while(i>=r);return e+i%n}irandom(e){return e<=0?0:this.irandomRange(0,e)}randomTimeRange(e,t){return t<=e?e:this.irandomRange(e,t)}randomTime(e){return this.irandom(e)}randomIndex(e){return this.irandom(e.length)}getState(){return{mt:this.mt.getState()}}setState(e){this.mt.setState(e.mt)}};function Cn(e){return new nt(e)}var x=1,A=2;var _e=8,Ee=16,Pn=32;var Dn=16384;var Q=65536,rt=1<<17,Un=1<<18,Fn=1<<19,In=1<<20,Bn=1<<21,Gn=1<<22,Vn=1<<23,as=1<<24,ee=1<<25,Wn=1<<26,cs=1<<27,us=1<<28,ls=1<<29,te=1<<30,hs=1<<31;var ds=1<<25,ms=1<<28,fs=1<<29,ps=1<<30,ys=1<<31,vs=x|A,gs=x|Q|A|ee|te,xs=x|Q|A,ws=x|rt|A|ee|te,Ss=Pn|_e|Ee,_s=x|Ee|_e,Hn=x|ee|te|A|Wn,Es=Un|Fn|In|Bn|Gn|Vn,Ts=x|_e|Ee|ee|te,As=x|Q|A,zs=x|A,Ns=x|Q|A|rt,Rs=Hn|Dn,Ls=Number.MAX_SAFE_INTEGER-1;var it=256,Kn=256,Xn=8192,Yn=2048,$n=512,jn=256,qn=it*2,Jn=256,we=32,st=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+Xn]="Sounds",e[e.Images=e.Sounds+Yn]="Images",e[e.Lights=e.Images+$n]="Lights",e[e.ShadowLights=e.Lights+Kn]="ShadowLights",e[e.Items=e.ShadowLights+Jn]="Items",e[e.PlayerSkins=e.Items+jn]="PlayerSkins",e[e.General=e.PlayerSkins+it]="General",e[e.WheelWeapons=e.General+qn]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+we]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+we]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+we]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(st||{}),Ms=st.MaxConfigStrings;var ot={...Rn};function h(){return{...ot}}var Qe=Object.freeze({aiflags:0,last_sighting:ot,trail_time:0,pausetime:0}),Zn=class{constructor(e){this.inUse=!1,this.freePending=!1,this.linkPrevious=null,this.linkNext=null,this.classname="",this.spawnflags=0,this.inventory={},this.origin=h(),this.old_origin=h(),this.velocity=h(),this.avelocity=h(),this.angles=h(),this.viewheight=0,this.mins=h(),this.maxs=h(),this.size=h(),this.mass=0,this.gravity=1,this.movetype=0,this.movedir=h(),this.modelindex=0,this.frame=0,this.skin=0,this.effects=0,this.renderfx=0,this.health=0,this.max_health=0,this.takedamage=!1,this.dmg=0,this.speed=0,this.deadflag=0,this.count=0,this.wait=0,this.delay=0,this.timestamp=0,this.sounds=0,this.noise_index=0,this.fly_sound_debounce_time=0,this.enemy=null,this.movetarget=null,this.target_ent=null,this.goalentity=null,this.ideal_yaw=0,this.yaw_speed=0,this.search_time=0,this.attack_finished_time=0,this.pain_finished_time=0,this.trail_time=0,this.groundentity=null,this.groundentity_linkcount=0,this.waterlevel=0,this.watertype=0,this.nextthink=0,this.activator=null,this.solid=0,this.flags=0,this.svflags=0,this.monsterinfo={...Qe,last_sighting:h()},this.show_hostile=0,this.light_level=0,this.index=e}reset(){this.inUse=!1,this.freePending=!1,this.linkPrevious=null,this.linkNext=null,this.classname="",this.spawnflags=0,this.target=void 0,this.targetname=void 0,this.killtarget=void 0,this.team=void 0,this.message=void 0,this.pathtarget=void 0,this.model=void 0,this.item=void 0,this.inventory={},this.origin=h(),this.old_origin=h(),this.velocity=h(),this.avelocity=h(),this.angles=h(),this.viewheight=0,this.mins=h(),this.maxs=h(),this.size=h(),this.mass=0,this.gravity=1,this.movetype=0,this.movedir=h(),this.modelindex=0,this.frame=0,this.skin=0,this.effects=0,this.renderfx=0,this.health=0,this.max_health=0,this.takedamage=!1,this.dmg=0,this.speed=0,this.deadflag=0,this.count=0,this.wait=0,this.delay=0,this.timestamp=0,this.sounds=0,this.noise_index=0,this.fly_sound_debounce_time=0,this.enemy=null,this.movetarget=null,this.target_ent=null,this.goalentity=null,this.ideal_yaw=0,this.yaw_speed=0,this.search_time=0,this.attack_finished_time=0,this.pain_finished_time=0,this.trail_time=0,this.groundentity=null,this.groundentity_linkcount=0,this.waterlevel=0,this.watertype=0,this.nextthink=0,this.think=void 0,this.touch=void 0,this.use=void 0,this.pain=void 0,this.die=void 0,this.activator=null,this.solid=0,this.flags=0,this.svflags=0,this.monsterinfo={...Qe,last_sighting:h()},this.combattarget=void 0,this.show_hostile=0,this.light_level=0}},Te=[{name:"classname",type:"string",save:!0},{name:"spawnflags",type:"int",save:!0},{name:"target",type:"string",save:!0},{name:"targetname",type:"string",save:!0},{name:"killtarget",type:"string",save:!0},{name:"team",type:"string",save:!0},{name:"message",type:"string",save:!0},{name:"pathtarget",type:"string",save:!0},{name:"model",type:"string",save:!0},{name:"item",type:"string",save:!0},{name:"inventory",type:"inventory",save:!0},{name:"origin",type:"vec3",save:!0},{name:"old_origin",type:"vec3",save:!0},{name:"velocity",type:"vec3",save:!0},{name:"avelocity",type:"vec3",save:!0},{name:"angles",type:"vec3",save:!0},{name:"viewheight",type:"int",save:!0},{name:"mins",type:"vec3",save:!0},{name:"maxs",type:"vec3",save:!0},{name:"size",type:"vec3",save:!0},{name:"mass",type:"int",save:!0},{name:"gravity",type:"float",save:!0},{name:"movetype",type:"int",save:!0},{name:"movedir",type:"vec3",save:!0},{name:"modelindex",type:"int",save:!0},{name:"frame",type:"int",save:!0},{name:"skin",type:"int",save:!0},{name:"effects",type:"int",save:!0},{name:"renderfx",type:"int",save:!0},{name:"health",type:"int",save:!0},{name:"max_health",type:"int",save:!0},{name:"takedamage",type:"boolean",save:!0},{name:"dmg",type:"int",save:!0},{name:"speed",type:"float",save:!0},{name:"deadflag",type:"int",save:!0},{name:"count",type:"int",save:!0},{name:"wait",type:"float",save:!0},{name:"delay",type:"float",save:!0},{name:"timestamp",type:"float",save:!0},{name:"sounds",type:"int",save:!0},{name:"noise_index",type:"int",save:!0},{name:"fly_sound_debounce_time",type:"float",save:!0},{name:"enemy",type:"entity",save:!0},{name:"movetarget",type:"entity",save:!0},{name:"target_ent",type:"entity",save:!0},{name:"goalentity",type:"entity",save:!0},{name:"ideal_yaw",type:"float",save:!0},{name:"yaw_speed",type:"float",save:!0},{name:"search_time",type:"float",save:!0},{name:"attack_finished_time",type:"float",save:!0},{name:"pain_finished_time",type:"float",save:!0},{name:"trail_time",type:"float",save:!0},{name:"groundentity",type:"entity",save:!0},{name:"groundentity_linkcount",type:"int",save:!0},{name:"waterlevel",type:"int",save:!0},{name:"watertype",type:"int",save:!0},{name:"nextthink",type:"float",save:!0},{name:"solid",type:"int",save:!0},{name:"flags",type:"int",save:!0},{name:"svflags",type:"int",save:!0},{name:"think",type:"callback",save:!1},{name:"touch",type:"callback",save:!1},{name:"use",type:"callback",save:!1},{name:"pain",type:"callback",save:!1},{name:"die",type:"callback",save:!1}],Qn=2048,O=0,er=class{constructor(e=Qn){if(this.freeList=[],this.pendingFree=[],this.activeHead=null,e<1||!Number.isInteger(e))throw new Error("EntityPool requires a positive integer size");this.entities=new Array(e);for(let n=0;n<e;n+=1)this.entities[n]=new Zn(n),n!==O&&this.freeList.push(n);let t=this.entities[O];t.inUse=!0,t.classname="worldspawn",this.activeHead=t}get world(){return this.entities[O]}get capacity(){return this.entities.length}get activeCount(){let e=0;for(let t of this)e+=1;return e}[Symbol.iterator](){let e=this.activeHead;return{next:()=>{if(!e)return{done:!0,value:void 0};let t=e;return e=e.linkNext,{done:!1,value:t}}}}spawn(){let e=this.freeList.pop();if(e===void 0)throw new Error("No free entities available");let t=this.entities[e];return t.reset(),t.inUse=!0,this.link(t),t}deferFree(e){if(e.index===O)throw new Error("Cannot free world entity");!e.inUse||e.freePending||(this.unlink(e),e.inUse=!1,e.freePending=!0,this.pendingFree.push(e.index))}freeImmediate(e){if(e.index===O)throw new Error("Cannot free world entity");e.inUse&&(this.unlink(e),e.reset(),this.freeList.push(e.index))}flushFreeList(){if(this.pendingFree.length!==0){for(let e of this.pendingFree)this.entities[e].reset(),this.freeList.push(e);this.pendingFree.length=0}}createSnapshot(){let e=Array.from(this,t=>t.index);return{capacity:this.entities.length,activeOrder:e,freeList:[...this.freeList],pendingFree:[...this.pendingFree]}}restore(e){if(e.capacity!==this.entities.length)throw new Error(`Snapshot capacity ${e.capacity} does not match pool capacity ${this.entities.length}`);let t=new Set,n=(r,i)=>{if(r<0||r>=this.entities.length)throw new Error(`Invalid entity index ${r} in ${i}`);if(t.has(r))throw new Error(`Duplicate entity index ${r} in snapshot`);t.add(r)};for(let r of e.activeOrder)n(r,"activeOrder");for(let r of e.freeList)n(r,"freeList");for(let r of e.pendingFree)n(r,"pendingFree");this.activeHead=null,this.freeList.length=0,this.pendingFree.length=0;for(let r of this.entities)r.reset();for(let r=e.activeOrder.length-1;r>=0;r-=1){let i=this.entities[e.activeOrder[r]];i.inUse=!0,this.link(i)}for(let r of e.pendingFree){let i=this.entities[r];i.inUse=!1,i.freePending=!0,i.linkNext=null,i.linkPrevious=null,this.pendingFree.push(r)}for(let r of e.freeList){let i=this.entities[r];i.inUse=!1,i.freePending=!1,i.linkNext=null,i.linkPrevious=null,this.freeList.push(r)}if(!e.activeOrder.includes(O))throw new Error("Snapshot must include the world entity as active")}link(e){e.linkNext=this.activeHead,this.activeHead&&(this.activeHead.linkPrevious=e),this.activeHead=e,e.linkPrevious=null}unlink(e){e.linkPrevious&&(e.linkPrevious.linkNext=e.linkNext),e.linkNext&&(e.linkNext.linkPrevious=e.linkPrevious),this.activeHead===e&&(this.activeHead=e.linkNext),e.linkPrevious=null,e.linkNext=null}},tr=class{constructor(){this.queue=[]}schedule(e,t){e.nextthink=t,this.queue.push({entity:e,time:t}),this.queue.sort((n,r)=>n.time===r.time?n.entity.index-r.entity.index:n.time-r.time)}cancel(e){if(this.queue.length!==0)for(let t=this.queue.length-1;t>=0;t-=1)this.queue[t].entity===e&&this.queue.splice(t,1)}snapshot(){return this.queue.map(({time:e,entity:t})=>({time:e,entityIndex:t.index}))}restore(e,t){this.queue.length=0;for(let n of e){let r=t(n.entityIndex);r&&this.schedule(r,n.time)}}runDueThinks(e){for(;this.queue.length>0;){let t=this.queue[0];if(t.time>e)break;this.queue.shift();let{entity:n,time:r}=t;!n.inUse||n.freePending||n.think&&n.nextthink===r&&n.think(n)}}};function $(e){return{min:{x:e.origin.x+e.mins.x,y:e.origin.y+e.mins.y,z:e.origin.z+e.mins.z},max:{x:e.origin.x+e.maxs.x,y:e.origin.y+e.maxs.y,z:e.origin.z+e.maxs.z}}}function et(e,t){return!(e.min.x>t.max.x||e.max.x<t.min.x||e.min.y>t.max.y||e.max.y<t.min.y||e.min.z>t.max.z||e.max.z<t.min.z)}var at=Te.filter(e=>e.save||e.type==="callback"),nr=new Map(at.map(e=>[e.name,e]));function rr(e){return[e.x,e.y,e.z]}function ir(e){let t=e;if(!Array.isArray(t)||t.length!==3)throw new Error("Invalid vec3 serialization");let[n,r,i]=t;return{x:n,y:r,z:i}}function k(e,t,n){e[t]=n}function sr(e){return{...e}}function or(e){if(e===null||typeof e!="object"||Array.isArray(e))throw new Error("Invalid inventory serialization");let t={};for(let[n,r]of Object.entries(e))t[n]=Number(r);return t}var ar=class{constructor(e,t,n){if(this.targetNameIndex=new Map,this.random=Cn(),this.currentTimeSeconds=0,this.pool=new er(t),this.thinkScheduler=new tr,this.engine=e,this.callbackToName=new Map,n)for(let[r,i]of n.entries())this.callbackToName.set(i,r)}get world(){return this.pool.world}get activeCount(){return this.pool.activeCount}get timeSeconds(){return this.currentTimeSeconds}forEachEntity(e){for(let t of this.pool)e(t)}spawn(){return this.pool.spawn()}free(e){this.unregisterTarget(e),this.thinkScheduler.cancel(e),this.pool.deferFree(e)}freeImmediate(e){this.unregisterTarget(e),this.thinkScheduler.cancel(e),this.pool.freeImmediate(e)}sound(e,t,n,r,i,o){this.engine.sound?.(e,t,n,r,i,o)}scheduleThink(e,t){this.thinkScheduler.schedule(e,t)}beginFrame(e){this.currentTimeSeconds=e}finalizeSpawn(e){!e.inUse||e.freePending||this.registerTarget(e)}findByClassname(e){let t=[];for(let n of this.pool)n.classname===e&&n.inUse&&!n.freePending&&t.push(n);return t}findByTargetName(e){let t=this.targetNameIndex.get(e);return t?Array.from(t).filter(n=>n.inUse&&!n.freePending):[]}pickTarget(e){if(!e)return null;let t=this.findByTargetName(e);if(t.length===0)return null;let n=this.random.randomIndex(t);return t[n]??null}killBox(e){let t=$(e);for(let n of this.pool)n===e||n===this.pool.world||!n.inUse||n.freePending||n.solid===0||n.svflags&2||et(t,$(n))&&(n.health=0,n.deadflag=2,this.free(n))}useTargets(e,t=null){if(e.delay>0){let n=this.spawn();n.classname="DelayedUse",n.target=e.target,n.killtarget=e.killtarget,n.message=e.message,n.think=r=>{this.useTargetsImmediate(r,t??e),this.free(r)},this.scheduleThink(n,this.currentTimeSeconds+e.delay);return}this.useTargetsImmediate(e,t??e)}runFrame(){this.thinkScheduler.runDueThinks(this.currentTimeSeconds),this.runTouches(),this.pool.flushFreeList()}createSnapshot(){let e=[];for(let t of this.pool){let n={};for(let r of at){let i=t[r.name];switch(r.type){case"vec3":n[r.name]=rr(i);break;case"entity":n[r.name]=i?.index??null;break;case"inventory":n[r.name]=sr(i);break;case"callback":n[r.name]=i?this.callbackToName.get(i)??null:null;break;default:n[r.name]=i??null;break}}e.push({index:t.index,fields:n})}return{timeSeconds:this.currentTimeSeconds,pool:this.pool.createSnapshot(),entities:e,thinks:this.thinkScheduler.snapshot()}}restore(e,t){this.currentTimeSeconds=e.timeSeconds,this.pool.restore(e.pool);let n=new Map;for(let i of this.pool)n.set(i.index,i);let r=[];for(let i of e.entities){let o=n.get(i.index);if(o)for(let[s,a]of Object.entries(i.fields)){let u=nr.get(s);if(!(!u||a===void 0))switch(u.type){case"vec3":k(o,s,ir(a));break;case"entity":r.push({entity:o,name:u.name,targetIndex:a});break;case"inventory":k(o,s,or(a));break;case"boolean":k(o,s,!!a);break;case"callback":if(a){let l=t?.get(a);l&&k(o,s,l)}break;default:k(o,s,a);break}}}for(let i of r){let o=i.targetIndex===null?null:n.get(i.targetIndex)??null;k(i.entity,i.name,o)}this.thinkScheduler.restore(e.thinks,i=>n.get(i))}runTouches(){let e=this.pool.world,t=[];for(let n of this.pool)n!==e&&(!n.inUse||n.freePending||n.solid===0||t.push(n));for(let n=0;n<t.length;n+=1){let r=t[n],i=null;for(let o=n+1;o<t.length;o+=1){let s=t[o];if(!r.touch&&!s.touch)continue;i||(i=$(r));let a=$(s);et(i,a)&&(r.touch&&r.touch(r,s),s.touch&&s.touch(s,r))}}}registerTarget(e){if(!e.targetname)return;let t=this.targetNameIndex.get(e.targetname);t||(t=new Set,this.targetNameIndex.set(e.targetname,t)),t.add(e)}unregisterTarget(e){if(!e.targetname)return;let t=this.targetNameIndex.get(e.targetname);t&&(t.delete(e),t.size===0&&this.targetNameIndex.delete(e.targetname))}useTargetsImmediate(e,t){if(e.target)for(let n of this.findByTargetName(e.target))n!==e&&n.use?.(n,e,t);if(e.killtarget)for(let n of this.findByTargetName(e.killtarget))n!==e&&this.free(n)}};var bs=1/40;var Os=new Map(Te.map(e=>[e.name,e]));var ct=(e=>(e[e.Bullets=0]="Bullets",e[e.Shells=1]="Shells",e[e.Rockets=2]="Rockets",e[e.Grenades=3]="Grenades",e[e.Cells=4]="Cells",e[e.Slugs=5]="Slugs",e))(ct||{}),ks=Object.keys(ct).length/2;var cr=["prep","simulate","finish"],ur=class{constructor(e){if(this.timeMs=0,this.frame=0,this.stageHandlers={prep:[],simulate:[],finish:[]},this.stageCounts={prep:0,simulate:0,finish:0},this.stageCompactionNeeded={prep:!1,simulate:!1,finish:!1},e)for(let t of cr){let n=e[t];n&&this.addStage(t,n)}}addStage(e,t){let n=this.stageHandlers[e];return n.push(t),this.stageCounts[e]+=1,()=>{let r=n.indexOf(t);r>=0&&n[r]&&(n[r]=void 0,this.stageCounts[e]-=1,this.stageCompactionNeeded[e]=!0)}}reset(e){this.timeMs=e,this.frame=0}advance(e){let t=this.timeMs;this.timeMs=t+e.deltaMs,this.frame=e.frame;let n={...e,timeMs:this.timeMs,previousTimeMs:t,deltaSeconds:e.deltaMs/1e3};if(this.runStage("prep",n),this.stageCounts.simulate===0)throw new Error("GameFrameLoop requires at least one simulate stage");return this.runStage("simulate",n),this.runStage("finish",n),n}runStage(e,t){let n=this.stageHandlers[e];for(let r=0;r<n.length;r+=1){let i=n[r];i&&i(t)}this.stageCompactionNeeded[e]&&this.compactStageHandlers(e)}compactStageHandlers(e){let t=this.stageHandlers[e],n=0;for(let r=0;r<t.length;r+=1){let i=t[r];i&&(t[n]=i,n+=1)}t.length=n,this.stageCompactionNeeded[e]=!1}get time(){return this.timeMs}get frameNumber(){return this.frame}},lr={frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0},hr=class{constructor(){this.state=lr}start(e){let t=e/1e3;this.state={frameNumber:0,timeSeconds:t,previousTimeSeconds:t,deltaSeconds:0}}tick(e){return this.state={frameNumber:e.frame,timeSeconds:e.timeMs/1e3,previousTimeSeconds:e.previousTimeMs/1e3,deltaSeconds:e.deltaSeconds},this.state}get current(){return this.state}restore(e){this.state={...e}}};var Cs=1<<24;var Se=2,dr=1;function p(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function d(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`${t} must be a finite number`);return e}function j(e,t,n){return e===void 0?n:d(e,t)}function Z(e,t){if(typeof e!="string")throw new Error(`${t} must be a string`);return e}function J(e,t){if(!Array.isArray(e))throw new Error(`${t} must be an array`);for(let n of e)d(n,`${t} element`);return e}function mr(e){if(e===void 0)return{frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0};let t=p(e,"level");return{frameNumber:j(t.frameNumber,"level.frameNumber",0),timeSeconds:j(t.timeSeconds,"level.timeSeconds",0),previousTimeSeconds:j(t.previousTimeSeconds,"level.previousTimeSeconds",0),deltaSeconds:j(t.deltaSeconds,"level.deltaSeconds",0)}}function fr(e){if(e===void 0)return new nt().getState();let t=p(e,"rng"),n=p(t.mt,"rng.mt"),r=J(n.state,"rng.mt.state");return{mt:{index:d(n.index,"rng.mt.index"),state:r}}}function pr(e){if(e===void 0)return[];if(!Array.isArray(e))throw new Error("thinks must be an array");return e.map((t,n)=>{let r=p(t,`thinks[${n}]`);return{time:d(r.time,`thinks[${n}].time`),entityIndex:d(r.entityIndex,`thinks[${n}].entityIndex`)}})}function yr(e){if(e===void 0)return{};let t=p(e,"entity.fields"),n={};for(let[r,i]of Object.entries(t)){if(i===null){n[r]=null;continue}switch(typeof i){case"number":case"string":case"boolean":n[r]=i;break;default:{if(!Array.isArray(i)){let o=p(i,r),s={};for(let[a,u]of Object.entries(o))s[a]=d(u,`${r}.${a}`);n[r]=s;break}if(Array.isArray(i)&&i.length===3){let[o,s,a]=i;n[r]=[d(o,`${r}[0]`),d(s,`${r}[1]`),d(a,`${r}[2]`)];break}throw new Error(`Unsupported entity field value for ${r}`)}}}return n}function vr(e){if(!Array.isArray(e))throw new Error("entities must be an array");return e.map((t,n)=>{let r=p(t,`entities[${n}]`);return{index:d(r.index,`entities[${n}].index`),fields:yr(r.fields)}})}function gr(e){let t=p(e,"pool");return{capacity:d(t.capacity,"pool.capacity"),activeOrder:J(t.activeOrder,"pool.activeOrder"),freeList:J(t.freeList,"pool.freeList"),pendingFree:J(t.pendingFree,"pool.pendingFree")}}function xr(e){let t=p(e,"entities");return{timeSeconds:d(t.timeSeconds,"entities.timeSeconds"),pool:gr(t.pool),entities:vr(t.entities),thinks:pr(t.thinks)}}function wr(e){if(e===void 0)return[];if(!Array.isArray(e))throw new Error("cvars must be an array");return e.map((t,n)=>{let r=p(t,`cvars[${n}]`);return{name:Z(r.name,`cvars[${n}].name`),value:Z(r.value,`cvars[${n}].value`),flags:d(r.flags,`cvars[${n}].flags`)}})}function Sr(e){if(e===void 0)return[];if(!Array.isArray(e))throw new Error("configstrings must be an array");return e.map((t,n)=>Z(t,`configstrings[${n}]`))}function _r(e){return e===void 0?{}:p(e,"gameState")}function ut(e,t={}){let{allowNewerVersion:n=!0}=t,r=typeof e=="string"?JSON.parse(e):e,i=p(r,"save"),o=i.version??Se,s=d(o,"version");if(s<dr)throw new Error(`Unsupported save version ${s}`);if(s>Se&&!n)throw new Error(`Save version ${s} is newer than supported ${Se}`);return{version:s,timestamp:d(i.timestamp,"timestamp"),map:Z(i.map,"map"),difficulty:d(i.difficulty,"difficulty"),playtimeSeconds:d(i.playtimeSeconds,"playtimeSeconds"),gameState:_r(i.gameState),level:mr(i.level),rng:fr(i.rng),entities:xr(i.entities),cvars:wr(i.cvars),configstrings:Sr(i.configstrings),player:i.player?i.player:void 0}}var Ps=new Set(Te.filter(e=>e.save).map(e=>e.name));var tt=globalThis.TextEncoder;function C(e){return ut({...e},{allowNewerVersion:!0})}function Er(e){return tt?new tt().encode(JSON.stringify(e)).length:JSON.stringify(e).length}var Tr=class{constructor(){this.records=new Map}async init(){return Promise.resolve()}async put(e){let t={id:e.id,metadata:{...e.metadata},save:C(e.save)};this.records.set(e.id,t)}async get(e){let t=this.records.get(e);return t?{id:t.id,metadata:{...t.metadata},save:C(t.save)}:null}async delete(e){return this.records.delete(e)}async list(){return Array.from(this.records.values()).map(e=>({id:e.id,metadata:{...e.metadata},save:C(e.save)}))}},Ar=class{constructor(e,t,n){this.indexedDB=e,this.dbName=t,this.storeName=n,this.db=null}async init(){this.db||(this.db=await new Promise((e,t)=>{let n=this.indexedDB.open(this.dbName,1);n.onupgradeneeded=()=>{n.result.createObjectStore(this.storeName,{keyPath:"id"})},n.onerror=()=>t(n.error??new Error("Failed to open IndexedDB")),n.onsuccess=()=>e(n.result)}))}async runTransaction(e,t){await this.init();let n=this.db;return new Promise((r,i)=>{let s=n.transaction(this.storeName,e).objectStore(this.storeName),a=t(s);a.onsuccess=()=>r(a.result),a.onerror=()=>i(a.error??new Error("IndexedDB request failed"))})}async put(e){await this.runTransaction("readwrite",t=>t.put(e))}async get(e){let t=await this.runTransaction("readonly",n=>n.get(e));return t?{id:t.id,metadata:{...t.metadata},save:C(t.save)}:null}async delete(e){return await this.get(e)?(await this.runTransaction("readwrite",n=>n.delete(e)),!0):!1}async list(){return(await this.runTransaction("readonly",t=>t.getAll())).map(t=>({id:t.id,metadata:{...t.metadata},save:C(t.save)}))}},Ae=class F{constructor(t={}){let{dbName:n=F.DEFAULT_DB_NAME,storeName:r=F.DEFAULT_STORE}=t,i=t.indexedDB??globalThis.indexedDB;i?this.adapter=new Ar(i,n,r):this.adapter=new Tr}async save(t,n,r={}){let i=C(n),o={id:t,name:r.name??t,map:i.map,difficulty:i.difficulty,playtimeSeconds:i.playtimeSeconds,timestamp:i.timestamp,version:i.version,bytes:Er(i)};return await this.adapter.init(),await this.adapter.put({id:t,metadata:o,save:i}),o}async load(t,n={}){await this.adapter.init();let r=await this.adapter.get(t);if(!r)throw new Error(`Save slot ${t} not found`);return ut(r.save,n)}async delete(t){return await this.adapter.init(),this.adapter.delete(t)}async list(){return await this.adapter.init(),(await this.adapter.list()).map(n=>({...n.metadata})).sort((n,r)=>r.timestamp-n.timestamp||n.id.localeCompare(r.id))}async quickSave(t){return this.save(F.QUICK_SLOT,t,{name:"Quick Save"})}async quickLoad(t={}){return this.load(F.QUICK_SLOT,t)}};Ae.DEFAULT_DB_NAME="quake2ts-saves";Ae.DEFAULT_STORE="saves";Ae.QUICK_SLOT="quicksave";var q={x:0,y:0,z:0};function lt(e,t){let n=t.gravity,r=new hr,i=new ur,o=new ar(e);i.addStage("prep",c=>{r.tick(c),o.beginFrame(r.current.timeSeconds)}),i.addStage("simulate",({deltaSeconds:c})=>{a={x:a.x+n.x*c,y:a.y+n.y*c,z:a.z+n.z*c},s={x:s.x+a.x*c,y:s.y+a.y*c,z:s.z+a.z*c},o.runFrame()});let s={...q},a={...q},u=c=>({frame:c,timeMs:i.time,state:{gravity:{...n},origin:{...s},velocity:{...a},level:{...r.current},entities:{activeCount:o.activeCount,worldClassname:o.world.classname}}}),l=c=>{i.reset(c),r.start(c),s={...q},a={...q},o.beginFrame(c/1e3),o.runFrame()};return{init(c){return l(c),e.trace({x:0,y:0,z:0},n),u(0)},shutdown(){},spawnWorld(){},frame(c){let m=i.advance(c);return u(m.frame)},entities:o,sound(c,m,f,S,N,oe){o.sound(c,m,f,S,N,oe)},centerprintf(c,m){e.centerprintf?.(c,m)},get time(){return r.current.timeSeconds}}}var ne={x:0,y:0,z:0};var Ys=Math.PI/180;var $s=Math.PI/180,js=180/Math.PI;var w=1,z=2;var Ne=8,Re=16,zr=32;var Nr=16384;var re=65536,ht=1<<17,Rr=1<<18,Lr=1<<19,Mr=1<<20,br=1<<21,Or=1<<22,kr=1<<23,qs=1<<24,ie=1<<25,Cr=1<<26,Js=1<<27,Zs=1<<28,Qs=1<<29,se=1<<30,eo=1<<31;var to=1<<25,no=1<<28,ro=1<<29,io=1<<30,so=1<<31;var oo=w|z,ao=w|re|z|ie|se,co=w|re|z,uo=w|ht|z|ie|se,lo=zr|Ne|Re,ho=w|Re|Ne,Pr=w|ie|se|z|Cr,mo=Rr|Lr|Mr|br|Or|kr,fo=w|Ne|Re|ie|se,po=w|re|z,yo=w|z,vo=w|re|z|ht,go=Pr|Nr;var xo=Number.MAX_SAFE_INTEGER-1;var dt=256;var Dr=256,Ur=8192,Fr=2048,Ir=512,Br=256,Gr=dt*2,Vr=256,ze=32;var mt=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+Ur]="Sounds",e[e.Images=e.Sounds+Fr]="Images",e[e.Lights=e.Images+Ir]="Lights",e[e.ShadowLights=e.Lights+Dr]="ShadowLights",e[e.Items=e.ShadowLights+Vr]="Items",e[e.PlayerSkins=e.Items+Br]="PlayerSkins",e[e.General=e.PlayerSkins+dt]="General",e[e.WheelWeapons=e.General+Gr]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+ze]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+ze]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+ze]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(mt||{}),wo=mt.MaxConfigStrings;function Wr(){let e=Ze({trace(i,o){return{start:i,end:o,fraction:1}}}),t=lt({trace(i,o){return{start:i,end:o,fraction:1}},sound:(i,o,s)=>console.log(`Sound played: ${s}`),centerprintf(i,o){let s=document.createElement("div");s.style.position="absolute",s.style.top="50%",s.style.left="50%",s.style.transform="translate(-50%, -50%)",s.style.color="white",s.style.fontSize="2em",s.style.fontFamily="sans-serif",s.innerText=o,document.body.appendChild(s),setTimeout(()=>document.body.removeChild(s),3e3)}},{gravity:ne}),n=Ke({engine:{trace:()=>({start:ne,end:ne,fraction:1})}}),r=Je(e,t,n);return r.start(),{engine:e,game:t,client:n,runtime:r}}return xt(Hr);})();
|
|
1
|
+
"use strict";var Quake2=(()=>{var De=Object.defineProperty;var Sr=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var Er=Object.prototype.hasOwnProperty;var _r=(e,t)=>{for(var r in t)De(e,r,{get:t[r],enumerable:!0})},Tr=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of wr(t))!Er.call(e,s)&&s!==r&&De(e,s,{get:()=>t[s],enumerable:!(n=Sr(t,s))||n.enumerable});return e};var Ar=e=>Tr(De({},"__esModule",{value:!0}),e);var na={};_r(na,{bootstrapViewer:()=>ra});var zr=Object.defineProperty,gt=(e,t)=>{for(var r in t)zr(e,r,{get:t[r],enumerable:!0})},M=1e-6,D=typeof Float32Array<"u"?Float32Array:Array,ft=Math.random;function Ue(e){return e>=0?Math.round(e):e%.5===0?Math.floor(e):Math.round(e)}var ia=Math.PI/180,oa=180/Math.PI,H={};gt(H,{add:()=>dn,adjoint:()=>Cr,clone:()=>Mr,copy:()=>Rr,create:()=>Nr,decompose:()=>Jr,determinant:()=>Pr,equals:()=>vn,exactEquals:()=>pn,frob:()=>hn,fromQuat:()=>en,fromQuat2:()=>$r,fromRotation:()=>Hr,fromRotationTranslation:()=>wt,fromRotationTranslationScale:()=>Zr,fromRotationTranslationScaleOrigin:()=>Qr,fromScaling:()=>Vr,fromTranslation:()=>Wr,fromValues:()=>Lr,fromXRotation:()=>Kr,fromYRotation:()=>Xr,fromZRotation:()=>Yr,frustum:()=>tn,getRotation:()=>jr,getScaling:()=>Et,getTranslation:()=>qr,identity:()=>xt,invert:()=>kr,lookAt:()=>cn,mul:()=>yn,multiply:()=>St,multiplyScalar:()=>mn,multiplyScalarAndAdd:()=>fn,ortho:()=>on,orthoNO:()=>Tt,orthoZO:()=>an,perspective:()=>rn,perspectiveFromFieldOfView:()=>sn,perspectiveNO:()=>_t,perspectiveZO:()=>nn,rotate:()=>Fr,rotateX:()=>Ir,rotateY:()=>Gr,rotateZ:()=>Br,scale:()=>Ur,set:()=>Or,str:()=>un,sub:()=>gn,subtract:()=>At,targetTo:()=>ln,translate:()=>Dr,transpose:()=>br});function Nr(){var e=new D(16);return D!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0),e[0]=1,e[5]=1,e[10]=1,e[15]=1,e}function Mr(e){var t=new D(16);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}function Rr(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}function Lr(e,t,r,n,s,i,o,a,c,l,u,d,h,m,p,v){var f=new D(16);return f[0]=e,f[1]=t,f[2]=r,f[3]=n,f[4]=s,f[5]=i,f[6]=o,f[7]=a,f[8]=c,f[9]=l,f[10]=u,f[11]=d,f[12]=h,f[13]=m,f[14]=p,f[15]=v,f}function Or(e,t,r,n,s,i,o,a,c,l,u,d,h,m,p,v,f){return e[0]=t,e[1]=r,e[2]=n,e[3]=s,e[4]=i,e[5]=o,e[6]=a,e[7]=c,e[8]=l,e[9]=u,e[10]=d,e[11]=h,e[12]=m,e[13]=p,e[14]=v,e[15]=f,e}function xt(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function br(e,t){if(e===t){var r=t[1],n=t[2],s=t[3],i=t[6],o=t[7],a=t[11];e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=r,e[6]=t[9],e[7]=t[13],e[8]=n,e[9]=i,e[11]=t[14],e[12]=s,e[13]=o,e[14]=a}else e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15];return e}function kr(e,t){var r=t[0],n=t[1],s=t[2],i=t[3],o=t[4],a=t[5],c=t[6],l=t[7],u=t[8],d=t[9],h=t[10],m=t[11],p=t[12],v=t[13],f=t[14],y=t[15],_=r*a-n*o,w=r*c-s*o,g=r*l-i*o,x=n*c-s*a,S=n*l-i*a,z=s*l-i*c,T=u*v-d*p,N=u*f-h*p,E=u*y-m*p,R=d*f-h*v,L=d*y-m*v,O=h*y-m*f,A=_*O-w*L+g*R+x*E-S*N+z*T;return A?(A=1/A,e[0]=(a*O-c*L+l*R)*A,e[1]=(s*L-n*O-i*R)*A,e[2]=(v*z-f*S+y*x)*A,e[3]=(h*S-d*z-m*x)*A,e[4]=(c*E-o*O-l*N)*A,e[5]=(r*O-s*E+i*N)*A,e[6]=(f*g-p*z-y*w)*A,e[7]=(u*z-h*g+m*w)*A,e[8]=(o*L-a*E+l*T)*A,e[9]=(n*E-r*L-i*T)*A,e[10]=(p*S-v*g+y*_)*A,e[11]=(d*g-u*S-m*_)*A,e[12]=(a*N-o*R-c*T)*A,e[13]=(r*R-n*N+s*T)*A,e[14]=(v*w-p*x-f*_)*A,e[15]=(u*x-d*w+h*_)*A,e):null}function Cr(e,t){var r=t[0],n=t[1],s=t[2],i=t[3],o=t[4],a=t[5],c=t[6],l=t[7],u=t[8],d=t[9],h=t[10],m=t[11],p=t[12],v=t[13],f=t[14],y=t[15],_=r*a-n*o,w=r*c-s*o,g=r*l-i*o,x=n*c-s*a,S=n*l-i*a,z=s*l-i*c,T=u*v-d*p,N=u*f-h*p,E=u*y-m*p,R=d*f-h*v,L=d*y-m*v,O=h*y-m*f;return e[0]=a*O-c*L+l*R,e[1]=s*L-n*O-i*R,e[2]=v*z-f*S+y*x,e[3]=h*S-d*z-m*x,e[4]=c*E-o*O-l*N,e[5]=r*O-s*E+i*N,e[6]=f*g-p*z-y*w,e[7]=u*z-h*g+m*w,e[8]=o*L-a*E+l*T,e[9]=n*E-r*L-i*T,e[10]=p*S-v*g+y*_,e[11]=d*g-u*S-m*_,e[12]=a*N-o*R-c*T,e[13]=r*R-n*N+s*T,e[14]=v*w-p*x-f*_,e[15]=u*x-d*w+h*_,e}function Pr(e){var t=e[0],r=e[1],n=e[2],s=e[3],i=e[4],o=e[5],a=e[6],c=e[7],l=e[8],u=e[9],d=e[10],h=e[11],m=e[12],p=e[13],v=e[14],f=e[15],y=t*o-r*i,_=t*a-n*i,w=r*a-n*o,g=l*p-u*m,x=l*v-d*m,S=u*v-d*p,z=t*S-r*x+n*g,T=i*S-o*x+a*g,N=l*w-u*_+d*y,E=m*w-p*_+v*y;return c*z-s*T+f*N-h*E}function St(e,t,r){var n=t[0],s=t[1],i=t[2],o=t[3],a=t[4],c=t[5],l=t[6],u=t[7],d=t[8],h=t[9],m=t[10],p=t[11],v=t[12],f=t[13],y=t[14],_=t[15],w=r[0],g=r[1],x=r[2],S=r[3];return e[0]=w*n+g*a+x*d+S*v,e[1]=w*s+g*c+x*h+S*f,e[2]=w*i+g*l+x*m+S*y,e[3]=w*o+g*u+x*p+S*_,w=r[4],g=r[5],x=r[6],S=r[7],e[4]=w*n+g*a+x*d+S*v,e[5]=w*s+g*c+x*h+S*f,e[6]=w*i+g*l+x*m+S*y,e[7]=w*o+g*u+x*p+S*_,w=r[8],g=r[9],x=r[10],S=r[11],e[8]=w*n+g*a+x*d+S*v,e[9]=w*s+g*c+x*h+S*f,e[10]=w*i+g*l+x*m+S*y,e[11]=w*o+g*u+x*p+S*_,w=r[12],g=r[13],x=r[14],S=r[15],e[12]=w*n+g*a+x*d+S*v,e[13]=w*s+g*c+x*h+S*f,e[14]=w*i+g*l+x*m+S*y,e[15]=w*o+g*u+x*p+S*_,e}function Dr(e,t,r){var n=r[0],s=r[1],i=r[2],o,a,c,l,u,d,h,m,p,v,f,y;return t===e?(e[12]=t[0]*n+t[4]*s+t[8]*i+t[12],e[13]=t[1]*n+t[5]*s+t[9]*i+t[13],e[14]=t[2]*n+t[6]*s+t[10]*i+t[14],e[15]=t[3]*n+t[7]*s+t[11]*i+t[15]):(o=t[0],a=t[1],c=t[2],l=t[3],u=t[4],d=t[5],h=t[6],m=t[7],p=t[8],v=t[9],f=t[10],y=t[11],e[0]=o,e[1]=a,e[2]=c,e[3]=l,e[4]=u,e[5]=d,e[6]=h,e[7]=m,e[8]=p,e[9]=v,e[10]=f,e[11]=y,e[12]=o*n+u*s+p*i+t[12],e[13]=a*n+d*s+v*i+t[13],e[14]=c*n+h*s+f*i+t[14],e[15]=l*n+m*s+y*i+t[15]),e}function Ur(e,t,r){var n=r[0],s=r[1],i=r[2];return e[0]=t[0]*n,e[1]=t[1]*n,e[2]=t[2]*n,e[3]=t[3]*n,e[4]=t[4]*s,e[5]=t[5]*s,e[6]=t[6]*s,e[7]=t[7]*s,e[8]=t[8]*i,e[9]=t[9]*i,e[10]=t[10]*i,e[11]=t[11]*i,e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}function Fr(e,t,r,n){var s=n[0],i=n[1],o=n[2],a=Math.sqrt(s*s+i*i+o*o),c,l,u,d,h,m,p,v,f,y,_,w,g,x,S,z,T,N,E,R,L,O,A,P;return a<M?null:(a=1/a,s*=a,i*=a,o*=a,c=Math.sin(r),l=Math.cos(r),u=1-l,d=t[0],h=t[1],m=t[2],p=t[3],v=t[4],f=t[5],y=t[6],_=t[7],w=t[8],g=t[9],x=t[10],S=t[11],z=s*s*u+l,T=i*s*u+o*c,N=o*s*u-i*c,E=s*i*u-o*c,R=i*i*u+l,L=o*i*u+s*c,O=s*o*u+i*c,A=i*o*u-s*c,P=o*o*u+l,e[0]=d*z+v*T+w*N,e[1]=h*z+f*T+g*N,e[2]=m*z+y*T+x*N,e[3]=p*z+_*T+S*N,e[4]=d*E+v*R+w*L,e[5]=h*E+f*R+g*L,e[6]=m*E+y*R+x*L,e[7]=p*E+_*R+S*L,e[8]=d*O+v*A+w*P,e[9]=h*O+f*A+g*P,e[10]=m*O+y*A+x*P,e[11]=p*O+_*A+S*P,t!==e&&(e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e)}function Ir(e,t,r){var n=Math.sin(r),s=Math.cos(r),i=t[4],o=t[5],a=t[6],c=t[7],l=t[8],u=t[9],d=t[10],h=t[11];return t!==e&&(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[4]=i*s+l*n,e[5]=o*s+u*n,e[6]=a*s+d*n,e[7]=c*s+h*n,e[8]=l*s-i*n,e[9]=u*s-o*n,e[10]=d*s-a*n,e[11]=h*s-c*n,e}function Gr(e,t,r){var n=Math.sin(r),s=Math.cos(r),i=t[0],o=t[1],a=t[2],c=t[3],l=t[8],u=t[9],d=t[10],h=t[11];return t!==e&&(e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[0]=i*s-l*n,e[1]=o*s-u*n,e[2]=a*s-d*n,e[3]=c*s-h*n,e[8]=i*n+l*s,e[9]=o*n+u*s,e[10]=a*n+d*s,e[11]=c*n+h*s,e}function Br(e,t,r){var n=Math.sin(r),s=Math.cos(r),i=t[0],o=t[1],a=t[2],c=t[3],l=t[4],u=t[5],d=t[6],h=t[7];return t!==e&&(e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[0]=i*s+l*n,e[1]=o*s+u*n,e[2]=a*s+d*n,e[3]=c*s+h*n,e[4]=l*s-i*n,e[5]=u*s-o*n,e[6]=d*s-a*n,e[7]=h*s-c*n,e}function Wr(e,t){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=t[0],e[13]=t[1],e[14]=t[2],e[15]=1,e}function Vr(e,t){return e[0]=t[0],e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t[1],e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t[2],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function Hr(e,t,r){var n=r[0],s=r[1],i=r[2],o=Math.sqrt(n*n+s*s+i*i),a,c,l;return o<M?null:(o=1/o,n*=o,s*=o,i*=o,a=Math.sin(t),c=Math.cos(t),l=1-c,e[0]=n*n*l+c,e[1]=s*n*l+i*a,e[2]=i*n*l-s*a,e[3]=0,e[4]=n*s*l-i*a,e[5]=s*s*l+c,e[6]=i*s*l+n*a,e[7]=0,e[8]=n*i*l+s*a,e[9]=s*i*l-n*a,e[10]=i*i*l+c,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e)}function Kr(e,t){var r=Math.sin(t),n=Math.cos(t);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=n,e[6]=r,e[7]=0,e[8]=0,e[9]=-r,e[10]=n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function Xr(e,t){var r=Math.sin(t),n=Math.cos(t);return e[0]=n,e[1]=0,e[2]=-r,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=r,e[9]=0,e[10]=n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function Yr(e,t){var r=Math.sin(t),n=Math.cos(t);return e[0]=n,e[1]=r,e[2]=0,e[3]=0,e[4]=-r,e[5]=n,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function wt(e,t,r){var n=t[0],s=t[1],i=t[2],o=t[3],a=n+n,c=s+s,l=i+i,u=n*a,d=n*c,h=n*l,m=s*c,p=s*l,v=i*l,f=o*a,y=o*c,_=o*l;return e[0]=1-(m+v),e[1]=d+_,e[2]=h-y,e[3]=0,e[4]=d-_,e[5]=1-(u+v),e[6]=p+f,e[7]=0,e[8]=h+y,e[9]=p-f,e[10]=1-(u+m),e[11]=0,e[12]=r[0],e[13]=r[1],e[14]=r[2],e[15]=1,e}function $r(e,t){var r=new D(3),n=-t[0],s=-t[1],i=-t[2],o=t[3],a=t[4],c=t[5],l=t[6],u=t[7],d=n*n+s*s+i*i+o*o;return d>0?(r[0]=(a*o+u*n+c*i-l*s)*2/d,r[1]=(c*o+u*s+l*n-a*i)*2/d,r[2]=(l*o+u*i+a*s-c*n)*2/d):(r[0]=(a*o+u*n+c*i-l*s)*2,r[1]=(c*o+u*s+l*n-a*i)*2,r[2]=(l*o+u*i+a*s-c*n)*2),wt(e,t,r),e}function qr(e,t){return e[0]=t[12],e[1]=t[13],e[2]=t[14],e}function Et(e,t){var r=t[0],n=t[1],s=t[2],i=t[4],o=t[5],a=t[6],c=t[8],l=t[9],u=t[10];return e[0]=Math.sqrt(r*r+n*n+s*s),e[1]=Math.sqrt(i*i+o*o+a*a),e[2]=Math.sqrt(c*c+l*l+u*u),e}function jr(e,t){var r=new D(3);Et(r,t);var n=1/r[0],s=1/r[1],i=1/r[2],o=t[0]*n,a=t[1]*s,c=t[2]*i,l=t[4]*n,u=t[5]*s,d=t[6]*i,h=t[8]*n,m=t[9]*s,p=t[10]*i,v=o+u+p,f=0;return v>0?(f=Math.sqrt(v+1)*2,e[3]=.25*f,e[0]=(d-m)/f,e[1]=(h-c)/f,e[2]=(a-l)/f):o>u&&o>p?(f=Math.sqrt(1+o-u-p)*2,e[3]=(d-m)/f,e[0]=.25*f,e[1]=(a+l)/f,e[2]=(h+c)/f):u>p?(f=Math.sqrt(1+u-o-p)*2,e[3]=(h-c)/f,e[0]=(a+l)/f,e[1]=.25*f,e[2]=(d+m)/f):(f=Math.sqrt(1+p-o-u)*2,e[3]=(a-l)/f,e[0]=(h+c)/f,e[1]=(d+m)/f,e[2]=.25*f),e}function Jr(e,t,r,n){t[0]=n[12],t[1]=n[13],t[2]=n[14];var s=n[0],i=n[1],o=n[2],a=n[4],c=n[5],l=n[6],u=n[8],d=n[9],h=n[10];r[0]=Math.sqrt(s*s+i*i+o*o),r[1]=Math.sqrt(a*a+c*c+l*l),r[2]=Math.sqrt(u*u+d*d+h*h);var m=1/r[0],p=1/r[1],v=1/r[2],f=s*m,y=i*p,_=o*v,w=a*m,g=c*p,x=l*v,S=u*m,z=d*p,T=h*v,N=f+g+T,E=0;return N>0?(E=Math.sqrt(N+1)*2,e[3]=.25*E,e[0]=(x-z)/E,e[1]=(S-_)/E,e[2]=(y-w)/E):f>g&&f>T?(E=Math.sqrt(1+f-g-T)*2,e[3]=(x-z)/E,e[0]=.25*E,e[1]=(y+w)/E,e[2]=(S+_)/E):g>T?(E=Math.sqrt(1+g-f-T)*2,e[3]=(S-_)/E,e[0]=(y+w)/E,e[1]=.25*E,e[2]=(x+z)/E):(E=Math.sqrt(1+T-f-g)*2,e[3]=(y-w)/E,e[0]=(S+_)/E,e[1]=(x+z)/E,e[2]=.25*E),e}function Zr(e,t,r,n){var s=t[0],i=t[1],o=t[2],a=t[3],c=s+s,l=i+i,u=o+o,d=s*c,h=s*l,m=s*u,p=i*l,v=i*u,f=o*u,y=a*c,_=a*l,w=a*u,g=n[0],x=n[1],S=n[2];return e[0]=(1-(p+f))*g,e[1]=(h+w)*g,e[2]=(m-_)*g,e[3]=0,e[4]=(h-w)*x,e[5]=(1-(d+f))*x,e[6]=(v+y)*x,e[7]=0,e[8]=(m+_)*S,e[9]=(v-y)*S,e[10]=(1-(d+p))*S,e[11]=0,e[12]=r[0],e[13]=r[1],e[14]=r[2],e[15]=1,e}function Qr(e,t,r,n,s){var i=t[0],o=t[1],a=t[2],c=t[3],l=i+i,u=o+o,d=a+a,h=i*l,m=i*u,p=i*d,v=o*u,f=o*d,y=a*d,_=c*l,w=c*u,g=c*d,x=n[0],S=n[1],z=n[2],T=s[0],N=s[1],E=s[2],R=(1-(v+y))*x,L=(m+g)*x,O=(p-w)*x,A=(m-g)*S,P=(1-(h+y))*S,se=(f+_)*S,ie=(p+w)*z,dt=(f-_)*z,mt=(1-(h+v))*z;return e[0]=R,e[1]=L,e[2]=O,e[3]=0,e[4]=A,e[5]=P,e[6]=se,e[7]=0,e[8]=ie,e[9]=dt,e[10]=mt,e[11]=0,e[12]=r[0]+T-(R*T+A*N+ie*E),e[13]=r[1]+N-(L*T+P*N+dt*E),e[14]=r[2]+E-(O*T+se*N+mt*E),e[15]=1,e}function en(e,t){var r=t[0],n=t[1],s=t[2],i=t[3],o=r+r,a=n+n,c=s+s,l=r*o,u=n*o,d=n*a,h=s*o,m=s*a,p=s*c,v=i*o,f=i*a,y=i*c;return e[0]=1-d-p,e[1]=u+y,e[2]=h-f,e[3]=0,e[4]=u-y,e[5]=1-l-p,e[6]=m+v,e[7]=0,e[8]=h+f,e[9]=m-v,e[10]=1-l-d,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function tn(e,t,r,n,s,i,o){var a=1/(r-t),c=1/(s-n),l=1/(i-o);return e[0]=i*2*a,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=i*2*c,e[6]=0,e[7]=0,e[8]=(r+t)*a,e[9]=(s+n)*c,e[10]=(o+i)*l,e[11]=-1,e[12]=0,e[13]=0,e[14]=o*i*2*l,e[15]=0,e}function _t(e,t,r,n,s){var i=1/Math.tan(t/2);if(e[0]=i/r,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=i,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[11]=-1,e[12]=0,e[13]=0,e[15]=0,s!=null&&s!==1/0){var o=1/(n-s);e[10]=(s+n)*o,e[14]=2*s*n*o}else e[10]=-1,e[14]=-2*n;return e}var rn=_t;function nn(e,t,r,n,s){var i=1/Math.tan(t/2);if(e[0]=i/r,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=i,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[11]=-1,e[12]=0,e[13]=0,e[15]=0,s!=null&&s!==1/0){var o=1/(n-s);e[10]=s*o,e[14]=s*n*o}else e[10]=-1,e[14]=-n;return e}function sn(e,t,r,n){var s=Math.tan(t.upDegrees*Math.PI/180),i=Math.tan(t.downDegrees*Math.PI/180),o=Math.tan(t.leftDegrees*Math.PI/180),a=Math.tan(t.rightDegrees*Math.PI/180),c=2/(o+a),l=2/(s+i);return e[0]=c,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=l,e[6]=0,e[7]=0,e[8]=-((o-a)*c*.5),e[9]=(s-i)*l*.5,e[10]=n/(r-n),e[11]=-1,e[12]=0,e[13]=0,e[14]=n*r/(r-n),e[15]=0,e}function Tt(e,t,r,n,s,i,o){var a=1/(t-r),c=1/(n-s),l=1/(i-o);return e[0]=-2*a,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=-2*c,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=2*l,e[11]=0,e[12]=(t+r)*a,e[13]=(s+n)*c,e[14]=(o+i)*l,e[15]=1,e}var on=Tt;function an(e,t,r,n,s,i,o){var a=1/(t-r),c=1/(n-s),l=1/(i-o);return e[0]=-2*a,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=-2*c,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=l,e[11]=0,e[12]=(t+r)*a,e[13]=(s+n)*c,e[14]=i*l,e[15]=1,e}function cn(e,t,r,n){var s,i,o,a,c,l,u,d,h,m,p=t[0],v=t[1],f=t[2],y=n[0],_=n[1],w=n[2],g=r[0],x=r[1],S=r[2];return Math.abs(p-g)<M&&Math.abs(v-x)<M&&Math.abs(f-S)<M?xt(e):(u=p-g,d=v-x,h=f-S,m=1/Math.sqrt(u*u+d*d+h*h),u*=m,d*=m,h*=m,s=_*h-w*d,i=w*u-y*h,o=y*d-_*u,m=Math.sqrt(s*s+i*i+o*o),m?(m=1/m,s*=m,i*=m,o*=m):(s=0,i=0,o=0),a=d*o-h*i,c=h*s-u*o,l=u*i-d*s,m=Math.sqrt(a*a+c*c+l*l),m?(m=1/m,a*=m,c*=m,l*=m):(a=0,c=0,l=0),e[0]=s,e[1]=a,e[2]=u,e[3]=0,e[4]=i,e[5]=c,e[6]=d,e[7]=0,e[8]=o,e[9]=l,e[10]=h,e[11]=0,e[12]=-(s*p+i*v+o*f),e[13]=-(a*p+c*v+l*f),e[14]=-(u*p+d*v+h*f),e[15]=1,e)}function ln(e,t,r,n){var s=t[0],i=t[1],o=t[2],a=n[0],c=n[1],l=n[2],u=s-r[0],d=i-r[1],h=o-r[2],m=u*u+d*d+h*h;m>0&&(m=1/Math.sqrt(m),u*=m,d*=m,h*=m);var p=c*h-l*d,v=l*u-a*h,f=a*d-c*u;return m=p*p+v*v+f*f,m>0&&(m=1/Math.sqrt(m),p*=m,v*=m,f*=m),e[0]=p,e[1]=v,e[2]=f,e[3]=0,e[4]=d*f-h*v,e[5]=h*p-u*f,e[6]=u*v-d*p,e[7]=0,e[8]=u,e[9]=d,e[10]=h,e[11]=0,e[12]=s,e[13]=i,e[14]=o,e[15]=1,e}function un(e){return"mat4("+e[0]+", "+e[1]+", "+e[2]+", "+e[3]+", "+e[4]+", "+e[5]+", "+e[6]+", "+e[7]+", "+e[8]+", "+e[9]+", "+e[10]+", "+e[11]+", "+e[12]+", "+e[13]+", "+e[14]+", "+e[15]+")"}function hn(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]+e[3]*e[3]+e[4]*e[4]+e[5]*e[5]+e[6]*e[6]+e[7]*e[7]+e[8]*e[8]+e[9]*e[9]+e[10]*e[10]+e[11]*e[11]+e[12]*e[12]+e[13]*e[13]+e[14]*e[14]+e[15]*e[15])}function dn(e,t,r){return e[0]=t[0]+r[0],e[1]=t[1]+r[1],e[2]=t[2]+r[2],e[3]=t[3]+r[3],e[4]=t[4]+r[4],e[5]=t[5]+r[5],e[6]=t[6]+r[6],e[7]=t[7]+r[7],e[8]=t[8]+r[8],e[9]=t[9]+r[9],e[10]=t[10]+r[10],e[11]=t[11]+r[11],e[12]=t[12]+r[12],e[13]=t[13]+r[13],e[14]=t[14]+r[14],e[15]=t[15]+r[15],e}function At(e,t,r){return e[0]=t[0]-r[0],e[1]=t[1]-r[1],e[2]=t[2]-r[2],e[3]=t[3]-r[3],e[4]=t[4]-r[4],e[5]=t[5]-r[5],e[6]=t[6]-r[6],e[7]=t[7]-r[7],e[8]=t[8]-r[8],e[9]=t[9]-r[9],e[10]=t[10]-r[10],e[11]=t[11]-r[11],e[12]=t[12]-r[12],e[13]=t[13]-r[13],e[14]=t[14]-r[14],e[15]=t[15]-r[15],e}function mn(e,t,r){return e[0]=t[0]*r,e[1]=t[1]*r,e[2]=t[2]*r,e[3]=t[3]*r,e[4]=t[4]*r,e[5]=t[5]*r,e[6]=t[6]*r,e[7]=t[7]*r,e[8]=t[8]*r,e[9]=t[9]*r,e[10]=t[10]*r,e[11]=t[11]*r,e[12]=t[12]*r,e[13]=t[13]*r,e[14]=t[14]*r,e[15]=t[15]*r,e}function fn(e,t,r,n){return e[0]=t[0]+r[0]*n,e[1]=t[1]+r[1]*n,e[2]=t[2]+r[2]*n,e[3]=t[3]+r[3]*n,e[4]=t[4]+r[4]*n,e[5]=t[5]+r[5]*n,e[6]=t[6]+r[6]*n,e[7]=t[7]+r[7]*n,e[8]=t[8]+r[8]*n,e[9]=t[9]+r[9]*n,e[10]=t[10]+r[10]*n,e[11]=t[11]+r[11]*n,e[12]=t[12]+r[12]*n,e[13]=t[13]+r[13]*n,e[14]=t[14]+r[14]*n,e[15]=t[15]+r[15]*n,e}function pn(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]&&e[6]===t[6]&&e[7]===t[7]&&e[8]===t[8]&&e[9]===t[9]&&e[10]===t[10]&&e[11]===t[11]&&e[12]===t[12]&&e[13]===t[13]&&e[14]===t[14]&&e[15]===t[15]}function vn(e,t){var r=e[0],n=e[1],s=e[2],i=e[3],o=e[4],a=e[5],c=e[6],l=e[7],u=e[8],d=e[9],h=e[10],m=e[11],p=e[12],v=e[13],f=e[14],y=e[15],_=t[0],w=t[1],g=t[2],x=t[3],S=t[4],z=t[5],T=t[6],N=t[7],E=t[8],R=t[9],L=t[10],O=t[11],A=t[12],P=t[13],se=t[14],ie=t[15];return Math.abs(r-_)<=M*Math.max(1,Math.abs(r),Math.abs(_))&&Math.abs(n-w)<=M*Math.max(1,Math.abs(n),Math.abs(w))&&Math.abs(s-g)<=M*Math.max(1,Math.abs(s),Math.abs(g))&&Math.abs(i-x)<=M*Math.max(1,Math.abs(i),Math.abs(x))&&Math.abs(o-S)<=M*Math.max(1,Math.abs(o),Math.abs(S))&&Math.abs(a-z)<=M*Math.max(1,Math.abs(a),Math.abs(z))&&Math.abs(c-T)<=M*Math.max(1,Math.abs(c),Math.abs(T))&&Math.abs(l-N)<=M*Math.max(1,Math.abs(l),Math.abs(N))&&Math.abs(u-E)<=M*Math.max(1,Math.abs(u),Math.abs(E))&&Math.abs(d-R)<=M*Math.max(1,Math.abs(d),Math.abs(R))&&Math.abs(h-L)<=M*Math.max(1,Math.abs(h),Math.abs(L))&&Math.abs(m-O)<=M*Math.max(1,Math.abs(m),Math.abs(O))&&Math.abs(p-A)<=M*Math.max(1,Math.abs(p),Math.abs(A))&&Math.abs(v-P)<=M*Math.max(1,Math.abs(v),Math.abs(P))&&Math.abs(f-se)<=M*Math.max(1,Math.abs(f),Math.abs(se))&&Math.abs(y-ie)<=M*Math.max(1,Math.abs(y),Math.abs(ie))}var yn=St,gn=At,V={};gt(V,{add:()=>_n,angle:()=>Xn,bezier:()=>Fn,ceil:()=>Tn,clone:()=>xn,copy:()=>wn,create:()=>zt,cross:()=>Cn,dist:()=>es,distance:()=>Ot,div:()=>Qn,divide:()=>Lt,dot:()=>Ke,equals:()=>jn,exactEquals:()=>qn,floor:()=>An,forEach:()=>ss,fromValues:()=>Sn,hermite:()=>Un,inverse:()=>bn,len:()=>rs,length:()=>Nt,lerp:()=>Pn,max:()=>Nn,min:()=>zn,mul:()=>Zn,multiply:()=>Rt,negate:()=>On,normalize:()=>kn,random:()=>In,rotateX:()=>Vn,rotateY:()=>Hn,rotateZ:()=>Kn,round:()=>Mn,scale:()=>Rn,scaleAndAdd:()=>Ln,set:()=>En,slerp:()=>Dn,sqrDist:()=>ts,sqrLen:()=>ns,squaredDistance:()=>bt,squaredLength:()=>kt,str:()=>$n,sub:()=>Jn,subtract:()=>Mt,transformMat3:()=>Bn,transformMat4:()=>Gn,transformQuat:()=>Wn,zero:()=>Yn});function zt(){var e=new D(3);return D!=Float32Array&&(e[0]=0,e[1]=0,e[2]=0),e}function xn(e){var t=new D(3);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function Nt(e){var t=e[0],r=e[1],n=e[2];return Math.sqrt(t*t+r*r+n*n)}function Sn(e,t,r){var n=new D(3);return n[0]=e,n[1]=t,n[2]=r,n}function wn(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}function En(e,t,r,n){return e[0]=t,e[1]=r,e[2]=n,e}function _n(e,t,r){return e[0]=t[0]+r[0],e[1]=t[1]+r[1],e[2]=t[2]+r[2],e}function Mt(e,t,r){return e[0]=t[0]-r[0],e[1]=t[1]-r[1],e[2]=t[2]-r[2],e}function Rt(e,t,r){return e[0]=t[0]*r[0],e[1]=t[1]*r[1],e[2]=t[2]*r[2],e}function Lt(e,t,r){return e[0]=t[0]/r[0],e[1]=t[1]/r[1],e[2]=t[2]/r[2],e}function Tn(e,t){return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2]),e}function An(e,t){return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2]),e}function zn(e,t,r){return e[0]=Math.min(t[0],r[0]),e[1]=Math.min(t[1],r[1]),e[2]=Math.min(t[2],r[2]),e}function Nn(e,t,r){return e[0]=Math.max(t[0],r[0]),e[1]=Math.max(t[1],r[1]),e[2]=Math.max(t[2],r[2]),e}function Mn(e,t){return e[0]=Ue(t[0]),e[1]=Ue(t[1]),e[2]=Ue(t[2]),e}function Rn(e,t,r){return e[0]=t[0]*r,e[1]=t[1]*r,e[2]=t[2]*r,e}function Ln(e,t,r,n){return e[0]=t[0]+r[0]*n,e[1]=t[1]+r[1]*n,e[2]=t[2]+r[2]*n,e}function Ot(e,t){var r=t[0]-e[0],n=t[1]-e[1],s=t[2]-e[2];return Math.sqrt(r*r+n*n+s*s)}function bt(e,t){var r=t[0]-e[0],n=t[1]-e[1],s=t[2]-e[2];return r*r+n*n+s*s}function kt(e){var t=e[0],r=e[1],n=e[2];return t*t+r*r+n*n}function On(e,t){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e}function bn(e,t){return e[0]=1/t[0],e[1]=1/t[1],e[2]=1/t[2],e}function kn(e,t){var r=t[0],n=t[1],s=t[2],i=r*r+n*n+s*s;return i>0&&(i=1/Math.sqrt(i)),e[0]=t[0]*i,e[1]=t[1]*i,e[2]=t[2]*i,e}function Ke(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function Cn(e,t,r){var n=t[0],s=t[1],i=t[2],o=r[0],a=r[1],c=r[2];return e[0]=s*c-i*a,e[1]=i*o-n*c,e[2]=n*a-s*o,e}function Pn(e,t,r,n){var s=t[0],i=t[1],o=t[2];return e[0]=s+n*(r[0]-s),e[1]=i+n*(r[1]-i),e[2]=o+n*(r[2]-o),e}function Dn(e,t,r,n){var s=Math.acos(Math.min(Math.max(Ke(t,r),-1),1)),i=Math.sin(s),o=Math.sin((1-n)*s)/i,a=Math.sin(n*s)/i;return e[0]=o*t[0]+a*r[0],e[1]=o*t[1]+a*r[1],e[2]=o*t[2]+a*r[2],e}function Un(e,t,r,n,s,i){var o=i*i,a=o*(2*i-3)+1,c=o*(i-2)+i,l=o*(i-1),u=o*(3-2*i);return e[0]=t[0]*a+r[0]*c+n[0]*l+s[0]*u,e[1]=t[1]*a+r[1]*c+n[1]*l+s[1]*u,e[2]=t[2]*a+r[2]*c+n[2]*l+s[2]*u,e}function Fn(e,t,r,n,s,i){var o=1-i,a=o*o,c=i*i,l=a*o,u=3*i*a,d=3*c*o,h=c*i;return e[0]=t[0]*l+r[0]*u+n[0]*d+s[0]*h,e[1]=t[1]*l+r[1]*u+n[1]*d+s[1]*h,e[2]=t[2]*l+r[2]*u+n[2]*d+s[2]*h,e}function In(e,t){t=t===void 0?1:t;var r=ft()*2*Math.PI,n=ft()*2-1,s=Math.sqrt(1-n*n)*t;return e[0]=Math.cos(r)*s,e[1]=Math.sin(r)*s,e[2]=n*t,e}function Gn(e,t,r){var n=t[0],s=t[1],i=t[2],o=r[3]*n+r[7]*s+r[11]*i+r[15];return o=o||1,e[0]=(r[0]*n+r[4]*s+r[8]*i+r[12])/o,e[1]=(r[1]*n+r[5]*s+r[9]*i+r[13])/o,e[2]=(r[2]*n+r[6]*s+r[10]*i+r[14])/o,e}function Bn(e,t,r){var n=t[0],s=t[1],i=t[2];return e[0]=n*r[0]+s*r[3]+i*r[6],e[1]=n*r[1]+s*r[4]+i*r[7],e[2]=n*r[2]+s*r[5]+i*r[8],e}function Wn(e,t,r){var n=r[0],s=r[1],i=r[2],o=r[3],a=t[0],c=t[1],l=t[2],u=s*l-i*c,d=i*a-n*l,h=n*c-s*a;return u=u+u,d=d+d,h=h+h,e[0]=a+o*u+s*h-i*d,e[1]=c+o*d+i*u-n*h,e[2]=l+o*h+n*d-s*u,e}function Vn(e,t,r,n){var s=[],i=[];return s[0]=t[0]-r[0],s[1]=t[1]-r[1],s[2]=t[2]-r[2],i[0]=s[0],i[1]=s[1]*Math.cos(n)-s[2]*Math.sin(n),i[2]=s[1]*Math.sin(n)+s[2]*Math.cos(n),e[0]=i[0]+r[0],e[1]=i[1]+r[1],e[2]=i[2]+r[2],e}function Hn(e,t,r,n){var s=[],i=[];return s[0]=t[0]-r[0],s[1]=t[1]-r[1],s[2]=t[2]-r[2],i[0]=s[2]*Math.sin(n)+s[0]*Math.cos(n),i[1]=s[1],i[2]=s[2]*Math.cos(n)-s[0]*Math.sin(n),e[0]=i[0]+r[0],e[1]=i[1]+r[1],e[2]=i[2]+r[2],e}function Kn(e,t,r,n){var s=[],i=[];return s[0]=t[0]-r[0],s[1]=t[1]-r[1],s[2]=t[2]-r[2],i[0]=s[0]*Math.cos(n)-s[1]*Math.sin(n),i[1]=s[0]*Math.sin(n)+s[1]*Math.cos(n),i[2]=s[2],e[0]=i[0]+r[0],e[1]=i[1]+r[1],e[2]=i[2]+r[2],e}function Xn(e,t){var r=e[0],n=e[1],s=e[2],i=t[0],o=t[1],a=t[2],c=Math.sqrt((r*r+n*n+s*s)*(i*i+o*o+a*a)),l=c&&Ke(e,t)/c;return Math.acos(Math.min(Math.max(l,-1),1))}function Yn(e){return e[0]=0,e[1]=0,e[2]=0,e}function $n(e){return"vec3("+e[0]+", "+e[1]+", "+e[2]+")"}function qn(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]}function jn(e,t){var r=e[0],n=e[1],s=e[2],i=t[0],o=t[1],a=t[2];return Math.abs(r-i)<=M*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(n-o)<=M*Math.max(1,Math.abs(n),Math.abs(o))&&Math.abs(s-a)<=M*Math.max(1,Math.abs(s),Math.abs(a))}var Jn=Mt,Zn=Rt,Qn=Lt,es=Ot,ts=bt,rs=Nt,ns=kt,ss=(function(){var e=zt();return function(t,r,n,s,i,o){var a,c;for(r||(r=3),n||(n=0),s?c=Math.min(s*r+n,t.length):c=t.length,a=n;a<c;a+=r)e[0]=t[a],e[1]=t[a+1],e[2]=t[a+2],i(e,e,o),t[a]=e[0],t[a+1]=e[1],t[a+2]=e[2];return t}})(),aa=Math.PI/180,ca=Math.PI/180,la=180/Math.PI,U=1,X=2;var Xe=8,Ye=16,is=32;var os=16384;var me=65536,Ct=1<<17,as=1<<18,cs=1<<19,ls=1<<20,us=1<<21,hs=1<<22,ds=1<<23,ua=1<<24,fe=1<<25,ms=1<<26,ha=1<<27,da=1<<28,ma=1<<29,pe=1<<30,fa=1<<31;var pa=1<<25,va=1<<28,ya=1<<29,ga=1<<30,xa=1<<31,Sa=U|X,wa=U|me|X|fe|pe,Ea=U|me|X,_a=U|Ct|X|fe|pe,Ta=is|Xe|Ye,Aa=U|Ye|Xe,fs=U|fe|pe|X|ms,za=as|cs|ls|us|hs|ds,Na=U|Xe|Ye|fe|pe,Ma=U|me|X,Ra=U|X,La=U|me|X|Ct,Oa=fs|os,ba=Number.MAX_SAFE_INTEGER-1,Pt=256,ps=256,vs=8192,ys=2048,gs=512,xs=256,Ss=Pt*2,ws=256,Fe=32,Dt=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+vs]="Sounds",e[e.Images=e.Sounds+ys]="Images",e[e.Lights=e.Images+gs]="Lights",e[e.ShadowLights=e.Lights+ps]="ShadowLights",e[e.Items=e.ShadowLights+ws]="Items",e[e.PlayerSkins=e.Items+xs]="PlayerSkins",e[e.General=e.PlayerSkins+Pt]="General",e[e.WheelWeapons=e.General+Ss]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+Fe]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+Fe]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+Fe]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(Dt||{}),ka=Dt.MaxConfigStrings;function Es(){let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=(r&1)!==0?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e}var Ca=Es(),Pa=Object.freeze([{name:"pak0.pak",checksum:2378051181,description:"Base game assets"},{name:"pak0.pak@baseq2",checksum:2378051181,description:"Base game assets (baseq2)"},{name:"pak0.pak@rogue",checksum:3373211245,description:"Ground Zero (rogue) mission pack"},{name:"pak0.pak@xatrix",checksum:1358269824,description:"The Reckoning (xatrix) mission pack"}]);var He=4,Ie=7*He,Da=[{index:0,size:3,type:5126,stride:Ie,offset:0},{index:1,size:2,type:5126,stride:Ie,offset:3*He},{index:2,size:2,type:5126,stride:Ie,offset:5*He}],Ua=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1]),_s=(e,t,r,n,s,i,o)=>{let a=H.create();H.lookAt(a,e,t,r);let c=H.create();return H.perspective(c,n,s,i,o),{position:e,viewMatrix:a,projectionMatrix:c}},Ts={x:0,y:0,z:0},Fa=Math.PI/180;function he(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function ce(e,t){return{x:e.x*t,y:e.y*t,z:e.z*t}}function ae(e,t){return e.x*t.x+e.y*t.y+e.z*t.z}function As(e){return ae(e,e)}function ve(e){return Math.sqrt(As(e))}function Ut(e){let t=ve(e);return t===0?e:ce(e,1/t)}var Ft=0,It=1,Gt=2,zs=Math.PI/180,Ia=180/Math.PI;function Ge(e,t){switch(t){case Ft:return e.x;case It:return e.y;case Gt:default:return e.z}}function Be(e){return e*zs}function pt(e){let t=e%360;return t<0?360+t:t}function Bt(e){let t=Be(Ge(e,It)),r=Be(Ge(e,Ft)),n=Be(Ge(e,Gt)),s=Math.sin(t),i=Math.cos(t),o=Math.sin(r),a=Math.cos(r),c=Math.sin(n),l=Math.cos(n),u={x:a*i,y:a*s,z:-o},d={x:-c*o*i-l*-s,y:-c*o*s-l*i,z:-c*a},h={x:l*o*i-c*-s,y:l*o*s-c*i,z:l*a};return{forward:u,right:d,up:h}}var F=1,Y=2;var $e=8,qe=16,Ns=32;var Ms=16384;var ye=65536,Wt=1<<17,Rs=1<<18,Ls=1<<19,Os=1<<20,bs=1<<21,ks=1<<22,Cs=1<<23,Ga=1<<24,ge=1<<25,Ps=1<<26,Ba=1<<27,Wa=1<<28,Va=1<<29,xe=1<<30,Ha=1<<31;var Ka=1<<25,Xa=1<<28,Ya=1<<29,$a=1<<30,qa=1<<31,ja=F|Y,Ja=F|ye|Y|ge|xe,Za=F|ye|Y,Qa=F|Wt|Y|ge|xe,ec=Ns|$e|qe,tc=F|qe|$e,Ds=F|ge|xe|Y|Ps,rc=Rs|Ls|Os|bs|ks|Cs,nc=F|$e|qe|ge|xe,sc=F|ye|Y,ic=F|Y,oc=F|ye|Y|Wt,ac=Ds|Ms,cc=Number.MAX_SAFE_INTEGER-1,Vt=256,Us=256,Fs=8192,Is=2048,Gs=512,Bs=256,Ws=Vt*2,Vs=256,We=32,Ht=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+Fs]="Sounds",e[e.Images=e.Sounds+Is]="Images",e[e.Lights=e.Images+Gs]="Lights",e[e.ShadowLights=e.Lights+Us]="ShadowLights",e[e.Items=e.ShadowLights+Vs]="Items",e[e.PlayerSkins=e.Items+Bs]="PlayerSkins",e[e.General=e.PlayerSkins+Vt]="General",e[e.WheelWeapons=e.General+Ws]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+We]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+We]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+We]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(Ht||{}),lc=Ht.MaxConfigStrings,de=(e=>(e[e.None=0]="None",e[e.Feet=1]="Feet",e[e.Waist=2]="Waist",e[e.Under=3]="Under",e))(de||{}),K=(e=>(e[e.Ducked=1]="Ducked",e[e.JumpHeld=2]="JumpHeld",e[e.OnGround=4]="OnGround",e[e.TimeWaterJump=8]="TimeWaterJump",e[e.TimeLand=16]="TimeLand",e[e.TimeTeleport=32]="TimeTeleport",e[e.NoPositionalPrediction=64]="NoPositionalPrediction",e[e.OnLadder=128]="OnLadder",e[e.NoAngularPrediction=256]="NoAngularPrediction",e[e.IgnorePlayerCollision=512]="IgnorePlayerCollision",e[e.TimeTrick=1024]="TimeTrick",e))(K||{});function ee(e,t){return(e&t)!==0}var Kt=(e=>(e[e.Normal=0]="Normal",e[e.Grapple=1]="Grapple",e[e.NoClip=2]="NoClip",e[e.Spectator=3]="Spectator",e[e.Dead=4]="Dead",e[e.Gib=5]="Gib",e[e.Freeze=6]="Freeze",e))(Kt||{}),Z=(e=>(e[e.None=0]="None",e[e.Attack=1]="Attack",e[e.Use=2]="Use",e[e.Holster=4]="Holster",e[e.Jump=8]="Jump",e[e.Crouch=16]="Crouch",e[e.Any=128]="Any",e))(Z||{});function Hs(e){let{velocity:t,frametime:r,onGround:n,groundIsSlick:s,onLadder:i,waterlevel:o,pmFriction:a,pmStopSpeed:c,pmWaterFriction:l}=e,u=ve(t);if(u<1)return{x:0,y:0,z:t.z};let d=0;if(n&&!s||i){let p=u<c?c:u;d+=p*a*r}o>0&&!i&&(d+=u*l*o*r);let h=u-d;if(h<0&&(h=0),h===u)return t;let m=h/u;return ce(t,m)}function vt(e){let{velocity:t,wishdir:r,wishspeed:n,accel:s,frametime:i}=e,o=ae(t,r),a=n-o;if(a<=0)return t;let c=s*i*n;return c>a&&(c=a),{x:t.x+r.x*c,y:t.y+r.y*c,z:t.z+r.z*c}}function Ks(e){let{velocity:t,wishdir:r,wishspeed:n,accel:s,frametime:i}=e,o=Math.min(n,30),a=ae(t,r),c=o-a;if(c<=0)return t;let l=s*n*i;return l>c&&(l=c),{x:t.x+r.x*l,y:t.y+r.y*l,z:t.z+r.z*l}}function Xs(e){let{forward:t,right:r,cmd:n,maxSpeed:s}=e,i={x:t.x*n.forwardmove+r.x*n.sidemove,y:t.y*n.forwardmove+r.y*n.sidemove,z:0},o=ve(i);if(o>s){let a=s/o;i=ce(i,a),o=s}return{wishdir:o===0?i:Ut(i),wishspeed:o}}function Ys(e){let{forward:t,right:r,cmd:n,maxSpeed:s}=e,i={x:t.x*n.forwardmove+r.x*n.sidemove,y:t.y*n.forwardmove+r.y*n.sidemove,z:0};n.upmove>10?i=he(i,{x:0,y:0,z:n.upmove}):n.upmove<-10?i=he(i,{x:0,y:0,z:n.upmove}):i=he(i,{x:0,y:0,z:10});let o=ve(i);if(o>s){let a=s/o;i=ce(i,a),o=s}return o*=.5,{wishdir:o===0?i:Ut(i),wishspeed:o}}function $s(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function qs(e){return e>89&&e<180?89:e<271&&e>=180?271:e}function Xt(e){let{pmFlags:t,cmdAngles:r,deltaAngles:n}=e,s;(t&32)!==0?s={x:0,y:r.y+n.y,z:0}:(s=$s(r,n),s={...s,x:qs(s.x)});let i=Bt(s);return{viewangles:s,...i}}var js={pmFriction:6,pmStopSpeed:100,pmAccelerate:10,pmAirAccelerate:1,pmWaterAccelerate:4,pmWaterFriction:1,pmMaxSpeed:300,pmDuckSpeed:100,pmWaterSpeed:400,groundIsSlick:!1},Js=800,Q={x:0,y:0,z:0},Zs=250;function oe(){return{origin:Q,velocity:Q,viewangles:Q,pmFlags:K.OnGround,pmType:Kt.Normal,waterlevel:de.None,gravity:Js,deltaAngles:Q}}function yt(e){return e?{...oe(),...e,origin:{...e.origin},velocity:{...e.velocity},viewangles:{...e.viewangles},deltaAngles:e.deltaAngles?{...e.deltaAngles}:Q}:oe()}function J(e,t,r){return e+(t-e)*r}function Ve(e,t,r){let n=pt(t-e);return n>180&&(n-=360),pt(e+n*r)}function Qs(e,t,r){let n=Math.max(0,Math.min(r,1));return{origin:{x:J(e.origin.x,t.origin.x,n),y:J(e.origin.y,t.origin.y,n),z:J(e.origin.z,t.origin.z,n)},velocity:{x:J(e.velocity.x,t.velocity.x,n),y:J(e.velocity.y,t.velocity.y,n),z:J(e.velocity.z,t.velocity.z,n)},viewangles:{x:Ve(e.viewangles.x,t.viewangles.x,n),y:Ve(e.viewangles.y,t.viewangles.y,n),z:Ve(e.viewangles.z,t.viewangles.z,n)},pmFlags:t.pmFlags,pmType:t.pmType,waterlevel:t.waterlevel,gravity:t.gravity,deltaAngles:t.deltaAngles}}function ei(e,t,r,n){let s=Math.min(Math.max(t.msec,0),Zs)/1e3,i=ee(e.pmFlags,K.OnGround),o=ee(e.pmFlags,K.OnLadder),a=Hs({velocity:e.velocity,frametime:s,onGround:i,groundIsSlick:r.groundIsSlick,onLadder:o,waterlevel:e.waterlevel,pmFriction:r.pmFriction,pmStopSpeed:r.pmStopSpeed,pmWaterFriction:r.pmWaterFriction}),{viewangles:c,forward:l,right:u}=Xt({pmFlags:e.pmFlags,cmdAngles:t.angles,deltaAngles:e.deltaAngles??Q}),d=e.waterlevel>de.None?Ys({forward:l,right:u,cmd:t,maxSpeed:r.pmWaterSpeed}):Xs({forward:l,right:u,cmd:t,maxSpeed:r.pmMaxSpeed});if(e.waterlevel>de.None)a=vt({velocity:a,wishdir:d.wishdir,wishspeed:d.wishspeed,accel:r.pmWaterAccelerate,frametime:s});else if(i||o){let p=ee(e.pmFlags,K.Ducked)?r.pmDuckSpeed:r.pmMaxSpeed,v=d.wishspeed>p?{wishdir:d.wishdir,wishspeed:p}:d;a=vt({velocity:a,wishdir:v.wishdir,wishspeed:v.wishspeed,accel:r.pmAccelerate,frametime:s})}else a=Ks({velocity:a,wishdir:d.wishdir,wishspeed:d.wishspeed,accel:r.pmAirAccelerate,frametime:s}),a={...a,z:a.z-e.gravity*s};let m=n(e.origin,he(e.origin,ce(a,s))).endpos;return{...e,origin:m,velocity:a,viewangles:c}}var ti=class{constructor(e,t={}){this.baseFrame={frame:0,timeMs:0,state:oe()},this.commands=[],this.predicted=oe(),this.settings={...js,...t},this.trace=e,this.predicted=this.baseFrame.state??oe()}setAuthoritative(e){let t=yt(e.state);return this.baseFrame={...e,state:t},this.commands=this.commands.filter(r=>(r.serverFrame??Number.MAX_SAFE_INTEGER)>e.frame),this.recompute()}enqueueCommand(e){return this.commands.push(e),this.recompute()}getPredictedState(){return this.predicted}recompute(){let e=yt(this.baseFrame.state);for(let t of this.commands)e=ei(e,t,this.settings,this.trace);return this.predicted=e,e}},ri={runPitch:.002,runRoll:.005,bobUp:.005,bobPitch:.002,bobRoll:.002,maxBobHeight:6,maxBobAngle:1.2};function ni(e){return{x:Math.max(-14,Math.min(14,e.x)),y:Math.max(-14,Math.min(14,e.y)),z:Math.max(-22,Math.min(30,e.z))}}function si(e,t,r){return t?e>210?r/400:e>100?r/800:r/1600:0}function ii(e,t,r,n,s){if(t<5)return{bobTime:0,bobCycle:0,bobCycleRun:0,bobFracSin:0};let i=si(t,n,s),o=e+i,c=ee(r,K.Ducked)&&n?o*4:o;return{bobTime:o,bobCycle:Math.floor(c),bobCycleRun:Math.floor(o),bobFracSin:Math.abs(Math.sin(c*Math.PI))}}var oi=class{constructor(e={}){this.bobTime=0,this.bobCycle=0,this.bobCycleRun=0,this.bobFracSin=0,this.settings={...ri,...e}}addKick(e){e.durationMs<=0||(this.kick={...e,remainingMs:e.durationMs})}get last(){return this.lastSample}sample(e,t){let{forward:r,right:n}=Bt(Xt({pmFlags:e.pmFlags,cmdAngles:e.viewangles,deltaAngles:e.deltaAngles??Ts}).viewangles),s=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),i=ee(e.pmFlags,K.OnGround),o=ii(this.bobTime,s,e.pmFlags,i,t);this.bobTime=o.bobTime,this.bobCycle=o.bobCycle,this.bobCycleRun=o.bobCycleRun,this.bobFracSin=o.bobFracSin;let a=ae(e.velocity,r)*this.settings.runPitch,c=ae(e.velocity,n)*this.settings.runRoll,l=this.bobFracSin*this.settings.bobPitch*s,u=this.bobFracSin*this.settings.bobRoll*s;ee(e.pmFlags,K.Ducked)&&i&&(l*=6,u*=6),a+=Math.min(l,this.settings.maxBobAngle),u=Math.min(u,this.settings.maxBobAngle),this.bobCycle&1&&(u=-u),c+=u;let d=Math.min(this.bobFracSin*s*this.settings.bobUp,this.settings.maxBobHeight),h=0,m=0;if(this.kick&&this.kick.remainingMs>0){let y=Math.max(0,Math.min(1,this.kick.remainingMs/this.kick.durationMs));h+=y*this.kick.pitch,m+=y*this.kick.roll,this.kick.remainingMs=Math.max(0,this.kick.remainingMs-t),this.kick.remainingMs===0&&(this.kick=void 0)}let f={angles:{x:a+h,y:0,z:c+m},offset:ni({x:0,y:0,z:d}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:s};return this.lastSample=f,f}};function ai(e){return e.trim().toLowerCase()}var Yt=(e=>(e.Forward="+forward",e.Back="+back",e.MoveLeft="+moveleft",e.MoveRight="+moveright",e.MoveUp="+moveup",e.MoveDown="+movedown",e.Jump="+jump",e.Crouch="+crouch",e.Attack="+attack",e.Use="+use",e.Holster="+holster",e.TurnLeft="+left",e.TurnRight="+right",e.LookUp="+lookup",e.LookDown="+lookdown",e.SpeedModifier="+speed",e.Zoom="+zoom",e))(Yt||{}),uc={"+attack":Z.Attack,"+use":Z.Use,"+holster":Z.Holster,"+jump":Z.Jump,"+crouch":Z.Crouch},hc=new Map(Object.values(Yt).map(e=>[ai(e),e]));function $t(e){let t=new ti(e.engine.trace),r=new oi,n,s,i,o;return{init(a){n=a,a?.state&&t.setAuthoritative(a),e.engine.trace({x:0,y:0,z:0},{x:1,y:0,z:0})},predict(a){return t.enqueueCommand(a)},render(a){a.latest?.state&&(t.setAuthoritative(a.latest),n=a.latest),a.previous?.state&&a.latest?.state?s=Qs(a.previous.state,a.latest.state,a.alpha):s=a.latest?.state??a.previous?.state??t.getPredictedState();let c=a.latest&&a.previous?Math.max(0,a.latest.timeMs-a.previous.timeMs):0;if(i=r.sample(s,c),s){let{origin:u,viewangles:d}=s,h=V.fromValues(u.x,u.y,u.z),m=H.create();H.rotateY(m,m,d.y*(Math.PI/180)),H.rotateX(m,m,d.x*(Math.PI/180));let p=V.transformMat4(V.create(),V.fromValues(1,0,0),m),v=V.add(V.create(),h,p);o=_s(h,v,V.fromValues(0,0,1),90,4/3,.1,1e3)}return{}},shutdown(){n=void 0,s=void 0},get prediction(){return t},get lastRendered(){return s},get view(){return r},get lastView(){return i},get camera(){return o}}}var qt=25,ci=5,li=()=>typeof performance<"u"?performance.now():Date.now(),ui=e=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>e()):setTimeout(e,qt)},jt=class{constructor(e,t={}){this.callbacks=e,this.accumulatorMs=0,this.frame=0,this.running=!1,this.tick=()=>{if(!this.running)return;let s=this.options.now(),i=this.lastTimeMs===void 0?0:s-this.lastTimeMs;this.lastTimeMs=s,this.advance(i,s),this.running&&this.options.schedule(this.tick)};let r=t.fixedDeltaMs??qt,n=t.maxSubSteps??ci;this.options={fixedDeltaMs:r,maxSubSteps:n,maxDeltaMs:t.maxDeltaMs??r*n,startTimeMs:t.startTimeMs,now:t.now??li,schedule:t.schedule??ui}}start(){this.running||(this.running=!0,this.lastTimeMs=this.options.startTimeMs??this.options.now(),this.options.schedule(this.tick))}stop(){this.running=!1}pump(e){let t=(this.lastTimeMs??0)+e;this.lastTimeMs=t,this.advance(e,t)}isRunning(){return this.running}get frameNumber(){return this.frame}advance(e,t){let r=Math.min(Math.max(e,0),this.options.maxDeltaMs);this.accumulatorMs=Math.min(this.accumulatorMs+r,this.options.fixedDeltaMs*this.options.maxSubSteps);let n=0;for(;this.accumulatorMs>=this.options.fixedDeltaMs&&n<this.options.maxSubSteps;)this.frame+=1,this.callbacks.simulate({frame:this.frame,deltaMs:this.options.fixedDeltaMs,nowMs:t}),this.accumulatorMs-=this.options.fixedDeltaMs,n+=1;let s=this.options.fixedDeltaMs===0?0:this.accumulatorMs/this.options.fixedDeltaMs;this.callbacks.render?.({alpha:s,nowMs:t,accumulatorMs:this.accumulatorMs,frame:this.frame})}},hi=class{constructor(e,t,r={}){this.game=e,this.client=t,this.started=!1,this.stepSimulation=s=>{this.previousFrame=this.latestFrame,this.latestFrame=this.game.frame(s,this.latestCommand)},this.renderClient=s=>{this.client&&(this.latestCommand=this.client.render({...s,previous:this.previousFrame,latest:this.latestFrame}))};let n=r.loop?.now?.()??Date.now();this.startTimeMs=r.startTimeMs??r.loop?.startTimeMs??n,this.loop=new jt({simulate:this.stepSimulation,render:this.renderClient},{...r.loop,startTimeMs:this.startTimeMs})}start(){this.started||(this.latestFrame=this.game.init(this.startTimeMs)??this.latestFrame,this.client?.init(this.latestFrame),this.started=!0,this.loop.start())}stop(){this.started&&(this.loop.stop(),this.client?.shutdown(),this.game.shutdown(),this.previousFrame=void 0,this.latestFrame=void 0,this.started=!1)}pump(e){this.loop.pump(e)}getLatestFrame(){return this.latestFrame}isRunning(){return this.loop.isRunning()}};var pc=Math.PI/180;var vc=Math.PI/180,yc=180/Math.PI;var I=1,$=2;var Qe=8,et=16,di=32;var mi=16384;var Se=65536,Jt=1<<17,fi=1<<18,pi=1<<19,vi=1<<20,yi=1<<21,gi=1<<22,xi=1<<23,gc=1<<24,we=1<<25,Si=1<<26,xc=1<<27,Sc=1<<28,wc=1<<29,Ee=1<<30,Ec=1<<31;var _c=1<<25,Tc=1<<28,Ac=1<<29,zc=1<<30,Nc=1<<31,Mc=I|$,Rc=I|Se|$|we|Ee,Lc=I|Se|$,Oc=I|Jt|$|we|Ee,bc=di|Qe|et,kc=I|et|Qe,wi=I|we|Ee|$|Si,Cc=fi|pi|vi|yi|gi|xi,Pc=I|Qe|et|we|Ee,Dc=I|Se|$,Uc=I|$,Fc=I|Se|$|Jt,Ic=wi|mi,Gc=Number.MAX_SAFE_INTEGER-1;var Zt=256,Ei=256,_i=8192,Ti=2048,Ai=512,zi=256,Ni=Zt*2,Mi=256,je=32;var Qt=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+_i]="Sounds",e[e.Images=e.Sounds+Ti]="Images",e[e.Lights=e.Images+Ai]="Lights",e[e.ShadowLights=e.Lights+Ei]="ShadowLights",e[e.Items=e.ShadowLights+Mi]="Items",e[e.PlayerSkins=e.Items+zi]="PlayerSkins",e[e.General=e.PlayerSkins+Zt]="General",e[e.WheelWeapons=e.General+Ni]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+je]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+je]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+je]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(Qt||{}),Bc=Qt.MaxConfigStrings;var Ri=class{constructor(e,t){this.engine=e,this.host=t,this.started=!1}start(){this.started||(this.engine.init(),this.host.start(),this.started=!0)}stop(){this.started&&(this.host.stop(),this.engine.shutdown(),this.started=!1)}pump(e){this.host.pump(e)}getLatestFrame(){return this.host.getLatestFrame()}isRunning(){return this.started&&this.host.isRunning()}};function er(e,t,r,n){return new Ri(e,new hi(t,r,n))}function Li(){let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=(r&1)!==0?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e}var Wc=Li();var Vc=Object.freeze([{name:"pak0.pak",checksum:2378051181,description:"Base game assets"},{name:"pak0.pak@baseq2",checksum:2378051181,description:"Base game assets (baseq2)"},{name:"pak0.pak@rogue",checksum:3373211245,description:"Ground Zero (rogue) mission pack"},{name:"pak0.pak@xatrix",checksum:1358269824,description:"The Reckoning (xatrix) mission pack"}]);var Ze=4,Je=7*Ze,Hc=[{index:0,size:3,type:5126,stride:Je,offset:0},{index:1,size:2,type:5126,stride:Je,offset:3*Ze},{index:2,size:2,type:5126,stride:Je,offset:5*Ze}];var Kc=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1]);function tr(e){return{init(){e.trace({x:0,y:0,z:0},{x:0,y:0,z:0})},shutdown(){},createMainLoop(t,r){return new jt(t,r)}}}var Oi={x:0,y:0,z:0},jc=Math.PI/180;function tt(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Me(e,t){return{x:e.x*t,y:e.y*t,z:e.z*t}}function ir(e,t){return e.x*t.x+e.y*t.y+e.z*t.z}function bi(e){return ir(e,e)}function Re(e){return Math.sqrt(bi(e))}function or(e){let t=Re(e);return t===0?e:Me(e,1/t)}var Jc=Math.PI/180,Zc=180/Math.PI;var G=624,ki=397,Ci=2567483615,Pi=2147483648,Di=2147483647,rt=4294967296,Ui=class{constructor(e=5489){this.state=new Uint32Array(G),this.index=G,this.seed(e)}seed(e){this.state[0]=e>>>0;for(let t=1;t<G;t++){let r=this.state[t-1]^this.state[t-1]>>>30,n=Math.imul(r>>>0,1812433253)+t;this.state[t]=n>>>0}this.index=G}nextUint32(){this.index>=G&&this.twist();let e=this.state[this.index++];return e^=e>>>11,e^=e<<7&2636928640,e^=e<<15&4022730752,e^=e>>>18,e>>>0}twist(){for(let e=0;e<G;e++){let t=this.state[e]&Pi|this.state[(e+1)%G]&Di,r=this.state[(e+ki)%G]^t>>>1;(t&1)!==0&&(r^=Ci),this.state[e]=r>>>0}this.index=0}getState(){return{index:this.index,state:Array.from(this.state)}}setState(e){if(e.state.length!==G)throw new Error(`Expected ${G} MT state values, received ${e.state.length}`);this.index=e.index,this.state=Uint32Array.from(e.state,t=>t>>>0)}},ar=class{constructor(e={}){this.mt=new Ui(e.seed)}frandom(){return this.mt.nextUint32()/rt}frandomRange(e,t){return e+(t-e)*this.frandom()}frandomMax(e){return this.frandomRange(0,e)}crandom(){return this.frandomRange(-1,1)}crandomOpen(){let e=Number.EPSILON;return this.frandomRange(-1+e,1)}irandomUint32(){return this.mt.nextUint32()}irandomRange(e,t){if(t-e<=1)return e;let r=t-e,n=rt-rt%r,s;do s=this.mt.nextUint32();while(s>=n);return e+s%r}irandom(e){return e<=0?0:this.irandomRange(0,e)}randomTimeRange(e,t){return t<=e?e:this.irandomRange(e,t)}randomTime(e){return this.irandom(e)}randomIndex(e){return this.irandom(e.length)}getState(){return{mt:this.mt.getState()}}setState(e){this.mt.setState(e.mt)}};function Fi(e){return new ar(e)}var B=1,q=2;var it=8,ot=16,Ii=32;var Gi=16384;var Le=65536,cr=1<<17,Bi=1<<18,Wi=1<<19,Vi=1<<20,Hi=1<<21,Ki=1<<22,Xi=1<<23,Qc=1<<24,Oe=1<<25,Yi=1<<26,el=1<<27,tl=1<<28,rl=1<<29,be=1<<30,nl=1<<31;var sl=1<<25,il=1<<28,ol=1<<29,al=1<<30,cl=1<<31,ll=B|q,ul=B|Le|q|Oe|be,hl=B|Le|q,dl=B|cr|q|Oe|be,ml=Ii|it|ot,fl=B|ot|it,$i=B|Oe|be|q|Yi,pl=Bi|Wi|Vi|Hi|Ki|Xi,vl=B|it|ot|Oe|be,yl=B|Le|q,gl=B|q,xl=B|Le|q|cr,Sl=$i|Gi,wl=Number.MAX_SAFE_INTEGER-1;var lr=256,qi=256,ji=8192,Ji=2048,Zi=512,Qi=256,eo=lr*2,to=256,nt=32,ur=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+ji]="Sounds",e[e.Images=e.Sounds+Ji]="Images",e[e.Lights=e.Images+Zi]="Lights",e[e.ShadowLights=e.Lights+qi]="ShadowLights",e[e.Items=e.ShadowLights+to]="Items",e[e.PlayerSkins=e.Items+Qi]="PlayerSkins",e[e.General=e.PlayerSkins+lr]="General",e[e.WheelWeapons=e.General+eo]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+nt]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+nt]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+nt]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(ur||{}),El=ur.MaxConfigStrings;function ro(e){let{velocity:t,frametime:r,onGround:n,groundIsSlick:s,onLadder:i,waterlevel:o,pmFriction:a,pmStopSpeed:c,pmWaterFriction:l}=e,u=Re(t);if(u<1)return{x:0,y:0,z:t.z};let d=0;if(n&&!s||i){let p=u<c?c:u;d+=p*a*r}o>0&&!i&&(d+=u*l*o*r);let h=u-d;if(h<0&&(h=0),h===u)return t;let m=h/u;return Me(t,m)}function no(e){let{velocity:t,wishdir:r,wishspeed:n,accel:s,frametime:i}=e,o=ir(t,r),a=n-o;if(a<=0)return t;let c=s*i*n;return c>a&&(c=a),{x:t.x+r.x*c,y:t.y+r.y*c,z:t.z+r.z*c}}function so(e){let{forward:t,right:r,cmd:n,maxSpeed:s}=e,i={x:t.x*n.forwardmove+r.x*n.sidemove,y:t.y*n.forwardmove+r.y*n.sidemove,z:0},o=Re(i);if(o>s){let a=s/o;i=Me(i,a),o=s}return{wishdir:o===0?i:or(i),wishspeed:o}}function io(e){let{forward:t,right:r,cmd:n,maxSpeed:s}=e,i={x:t.x*n.forwardmove+r.x*n.sidemove,y:t.y*n.forwardmove+r.y*n.sidemove,z:0};n.upmove>10?i=tt(i,{x:0,y:0,z:n.upmove}):n.upmove<-10?i=tt(i,{x:0,y:0,z:n.upmove}):i=tt(i,{x:0,y:0,z:10});let o=Re(i);if(o>s){let a=s/o;i=Me(i,a),o=s}return o*=.5,{wishdir:o===0?i:or(i),wishspeed:o}}var le=.025,oo=(e,t)=>{let r={...e.origin};r.z-=.25;let n=t(e.origin,r);return{...e,onGround:n.fraction<1}},ao=(e,t)=>{let r={...e.origin};return r.z+=e.mins.z+1,t(r)&33554432?{...e,waterLevel:1}:{...e,waterLevel:0}},co=(e,t,r,n)=>{let s={...e};s=oo(s,r),s=ao(s,n);let{origin:i,velocity:o,onGround:a,waterLevel:c}=s,l=ro({velocity:o,frametime:le,onGround:a,groundIsSlick:!1,onLadder:!1,waterlevel:c,pmFriction:6,pmStopSpeed:100,pmWaterFriction:1}),u=c>=2?io({forward:{x:1,y:0,z:0},right:{x:0,y:1,z:0},cmd:t,maxSpeed:320}):so({forward:{x:1,y:0,z:0},right:{x:0,y:1,z:0},cmd:t,maxSpeed:320}),d=no({velocity:l,wishdir:u.wishdir,wishspeed:u.wishspeed,accel:a?10:1,frametime:le}),h=r(i,{x:i.x+d.x*le,y:i.y+d.y*le,z:i.z+d.z*le});return{...s,origin:h.endpos,velocity:d}};var hr={...Oi};function b(){return{...hr}}var rr=Object.freeze({aiflags:0,last_sighting:hr,trail_time:0,pausetime:0}),lo=class{constructor(e){this.inUse=!1,this.freePending=!1,this.linkPrevious=null,this.linkNext=null,this.classname="",this.spawnflags=0,this.inventory={},this.origin=b(),this.old_origin=b(),this.velocity=b(),this.avelocity=b(),this.angles=b(),this.viewheight=0,this.mins=b(),this.maxs=b(),this.size=b(),this.mass=0,this.gravity=1,this.movetype=0,this.movedir=b(),this.modelindex=0,this.frame=0,this.skin=0,this.effects=0,this.renderfx=0,this.health=0,this.max_health=0,this.takedamage=!1,this.dmg=0,this.speed=0,this.deadflag=0,this.count=0,this.wait=0,this.delay=0,this.timestamp=0,this.sounds=0,this.noise_index=0,this.fly_sound_debounce_time=0,this.enemy=null,this.movetarget=null,this.target_ent=null,this.goalentity=null,this.ideal_yaw=0,this.yaw_speed=0,this.search_time=0,this.attack_finished_time=0,this.pain_finished_time=0,this.trail_time=0,this.groundentity=null,this.groundentity_linkcount=0,this.waterlevel=0,this.watertype=0,this.nextthink=0,this.activator=null,this.solid=0,this.flags=0,this.svflags=0,this.monsterinfo={...rr,last_sighting:b()},this.show_hostile=0,this.light_level=0,this.index=e}reset(){this.inUse=!1,this.freePending=!1,this.linkPrevious=null,this.linkNext=null,this.classname="",this.spawnflags=0,this.target=void 0,this.targetname=void 0,this.killtarget=void 0,this.team=void 0,this.message=void 0,this.pathtarget=void 0,this.model=void 0,this.item=void 0,this.inventory={},this.origin=b(),this.old_origin=b(),this.velocity=b(),this.avelocity=b(),this.angles=b(),this.viewheight=0,this.mins=b(),this.maxs=b(),this.size=b(),this.mass=0,this.gravity=1,this.movetype=0,this.movedir=b(),this.modelindex=0,this.frame=0,this.skin=0,this.effects=0,this.renderfx=0,this.health=0,this.max_health=0,this.takedamage=!1,this.dmg=0,this.speed=0,this.deadflag=0,this.count=0,this.wait=0,this.delay=0,this.timestamp=0,this.sounds=0,this.noise_index=0,this.fly_sound_debounce_time=0,this.enemy=null,this.movetarget=null,this.target_ent=null,this.goalentity=null,this.ideal_yaw=0,this.yaw_speed=0,this.search_time=0,this.attack_finished_time=0,this.pain_finished_time=0,this.trail_time=0,this.groundentity=null,this.groundentity_linkcount=0,this.waterlevel=0,this.watertype=0,this.nextthink=0,this.think=void 0,this.touch=void 0,this.use=void 0,this.pain=void 0,this.die=void 0,this.activator=null,this.solid=0,this.flags=0,this.svflags=0,this.monsterinfo={...rr,last_sighting:b()},this.combattarget=void 0,this.show_hostile=0,this.light_level=0}},at=[{name:"classname",type:"string",save:!0},{name:"spawnflags",type:"int",save:!0},{name:"target",type:"string",save:!0},{name:"targetname",type:"string",save:!0},{name:"killtarget",type:"string",save:!0},{name:"team",type:"string",save:!0},{name:"message",type:"string",save:!0},{name:"pathtarget",type:"string",save:!0},{name:"model",type:"string",save:!0},{name:"item",type:"string",save:!0},{name:"inventory",type:"inventory",save:!0},{name:"origin",type:"vec3",save:!0},{name:"old_origin",type:"vec3",save:!0},{name:"velocity",type:"vec3",save:!0},{name:"avelocity",type:"vec3",save:!0},{name:"angles",type:"vec3",save:!0},{name:"viewheight",type:"int",save:!0},{name:"mins",type:"vec3",save:!0},{name:"maxs",type:"vec3",save:!0},{name:"size",type:"vec3",save:!0},{name:"mass",type:"int",save:!0},{name:"gravity",type:"float",save:!0},{name:"movetype",type:"int",save:!0},{name:"movedir",type:"vec3",save:!0},{name:"modelindex",type:"int",save:!0},{name:"frame",type:"int",save:!0},{name:"skin",type:"int",save:!0},{name:"effects",type:"int",save:!0},{name:"renderfx",type:"int",save:!0},{name:"health",type:"int",save:!0},{name:"max_health",type:"int",save:!0},{name:"takedamage",type:"boolean",save:!0},{name:"dmg",type:"int",save:!0},{name:"speed",type:"float",save:!0},{name:"deadflag",type:"int",save:!0},{name:"count",type:"int",save:!0},{name:"wait",type:"float",save:!0},{name:"delay",type:"float",save:!0},{name:"timestamp",type:"float",save:!0},{name:"sounds",type:"int",save:!0},{name:"noise_index",type:"int",save:!0},{name:"fly_sound_debounce_time",type:"float",save:!0},{name:"enemy",type:"entity",save:!0},{name:"movetarget",type:"entity",save:!0},{name:"target_ent",type:"entity",save:!0},{name:"goalentity",type:"entity",save:!0},{name:"ideal_yaw",type:"float",save:!0},{name:"yaw_speed",type:"float",save:!0},{name:"search_time",type:"float",save:!0},{name:"attack_finished_time",type:"float",save:!0},{name:"pain_finished_time",type:"float",save:!0},{name:"trail_time",type:"float",save:!0},{name:"groundentity",type:"entity",save:!0},{name:"groundentity_linkcount",type:"int",save:!0},{name:"waterlevel",type:"int",save:!0},{name:"watertype",type:"int",save:!0},{name:"nextthink",type:"float",save:!0},{name:"solid",type:"int",save:!0},{name:"flags",type:"int",save:!0},{name:"svflags",type:"int",save:!0},{name:"think",type:"callback",save:!1},{name:"touch",type:"callback",save:!1},{name:"use",type:"callback",save:!1},{name:"pain",type:"callback",save:!1},{name:"die",type:"callback",save:!1}],uo=2048,te=0,ho=class{constructor(e=uo){if(this.freeList=[],this.pendingFree=[],this.activeHead=null,e<1||!Number.isInteger(e))throw new Error("EntityPool requires a positive integer size");this.entities=new Array(e);for(let r=0;r<e;r+=1)this.entities[r]=new lo(r),r!==te&&this.freeList.push(r);let t=this.entities[te];t.inUse=!0,t.classname="worldspawn",this.activeHead=t}get world(){return this.entities[te]}get capacity(){return this.entities.length}get activeCount(){let e=0;for(let t of this)e+=1;return e}[Symbol.iterator](){let e=this.activeHead;return{next:()=>{if(!e)return{done:!0,value:void 0};let t=e;return e=e.linkNext,{done:!1,value:t}}}}spawn(){let e=this.freeList.pop();if(e===void 0)throw new Error("No free entities available");let t=this.entities[e];return t.reset(),t.inUse=!0,this.link(t),t}deferFree(e){if(e.index===te)throw new Error("Cannot free world entity");!e.inUse||e.freePending||(this.unlink(e),e.inUse=!1,e.freePending=!0,this.pendingFree.push(e.index))}freeImmediate(e){if(e.index===te)throw new Error("Cannot free world entity");e.inUse&&(this.unlink(e),e.reset(),this.freeList.push(e.index))}flushFreeList(){if(this.pendingFree.length!==0){for(let e of this.pendingFree)this.entities[e].reset(),this.freeList.push(e);this.pendingFree.length=0}}createSnapshot(){let e=Array.from(this,t=>t.index);return{capacity:this.entities.length,activeOrder:e,freeList:[...this.freeList],pendingFree:[...this.pendingFree]}}restore(e){if(e.capacity!==this.entities.length)throw new Error(`Snapshot capacity ${e.capacity} does not match pool capacity ${this.entities.length}`);let t=new Set,r=(n,s)=>{if(n<0||n>=this.entities.length)throw new Error(`Invalid entity index ${n} in ${s}`);if(t.has(n))throw new Error(`Duplicate entity index ${n} in snapshot`);t.add(n)};for(let n of e.activeOrder)r(n,"activeOrder");for(let n of e.freeList)r(n,"freeList");for(let n of e.pendingFree)r(n,"pendingFree");this.activeHead=null,this.freeList.length=0,this.pendingFree.length=0;for(let n of this.entities)n.reset();for(let n=e.activeOrder.length-1;n>=0;n-=1){let s=this.entities[e.activeOrder[n]];s.inUse=!0,this.link(s)}for(let n of e.pendingFree){let s=this.entities[n];s.inUse=!1,s.freePending=!0,s.linkNext=null,s.linkPrevious=null,this.pendingFree.push(n)}for(let n of e.freeList){let s=this.entities[n];s.inUse=!1,s.freePending=!1,s.linkNext=null,s.linkPrevious=null,this.freeList.push(n)}if(!e.activeOrder.includes(te))throw new Error("Snapshot must include the world entity as active")}link(e){e.linkNext=this.activeHead,this.activeHead&&(this.activeHead.linkPrevious=e),this.activeHead=e,e.linkPrevious=null}unlink(e){e.linkPrevious&&(e.linkPrevious.linkNext=e.linkNext),e.linkNext&&(e.linkNext.linkPrevious=e.linkPrevious),this.activeHead===e&&(this.activeHead=e.linkNext),e.linkPrevious=null,e.linkNext=null}},mo=class{constructor(){this.queue=[]}schedule(e,t){e.nextthink=t,this.queue.push({entity:e,time:t}),this.queue.sort((r,n)=>r.time===n.time?r.entity.index-n.entity.index:r.time-n.time)}cancel(e){if(this.queue.length!==0)for(let t=this.queue.length-1;t>=0;t-=1)this.queue[t].entity===e&&this.queue.splice(t,1)}snapshot(){return this.queue.map(({time:e,entity:t})=>({time:e,entityIndex:t.index}))}restore(e,t){this.queue.length=0;for(let r of e){let n=t(r.entityIndex);n&&this.schedule(n,r.time)}}runDueThinks(e){for(;this.queue.length>0;){let t=this.queue[0];if(t.time>e)break;this.queue.shift();let{entity:r,time:n}=t;!r.inUse||r.freePending||r.think&&r.nextthink===n&&r.think(r)}}};function _e(e){return{min:{x:e.origin.x+e.mins.x,y:e.origin.y+e.mins.y,z:e.origin.z+e.mins.z},max:{x:e.origin.x+e.maxs.x,y:e.origin.y+e.maxs.y,z:e.origin.z+e.maxs.z}}}function nr(e,t){return!(e.min.x>t.max.x||e.max.x<t.min.x||e.min.y>t.max.y||e.max.y<t.min.y||e.min.z>t.max.z||e.max.z<t.min.z)}var dr=at.filter(e=>e.save||e.type==="callback"),fo=new Map(dr.map(e=>[e.name,e]));function po(e){return[e.x,e.y,e.z]}function vo(e){let t=e;if(!Array.isArray(t)||t.length!==3)throw new Error("Invalid vec3 serialization");let[r,n,s]=t;return{x:r,y:n,z:s}}function re(e,t,r){e[t]=r}function yo(e){return{...e}}function go(e){if(e===null||typeof e!="object"||Array.isArray(e))throw new Error("Invalid inventory serialization");let t={};for(let[r,n]of Object.entries(e))t[r]=Number(n);return t}var xo=class{constructor(e,t,r){if(this.targetNameIndex=new Map,this.random=Fi(),this.currentTimeSeconds=0,this.pool=new ho(t),this.thinkScheduler=new mo,this.engine=e,this.callbackToName=new Map,r)for(let[n,s]of r.entries())this.callbackToName.set(s,n)}get world(){return this.pool.world}get activeCount(){return this.pool.activeCount}get timeSeconds(){return this.currentTimeSeconds}forEachEntity(e){for(let t of this.pool)e(t)}find(e){for(let t of this.pool)if(e(t))return t}spawn(){return this.pool.spawn()}free(e){this.unregisterTarget(e),this.thinkScheduler.cancel(e),this.pool.deferFree(e)}freeImmediate(e){this.unregisterTarget(e),this.thinkScheduler.cancel(e),this.pool.freeImmediate(e)}sound(e,t,r,n,s,i){this.engine.sound?.(e,t,r,n,s,i)}scheduleThink(e,t){this.thinkScheduler.schedule(e,t)}beginFrame(e){this.currentTimeSeconds=e}finalizeSpawn(e){!e.inUse||e.freePending||this.registerTarget(e)}findByClassname(e){let t=[];for(let r of this.pool)r.classname===e&&r.inUse&&!r.freePending&&t.push(r);return t}findByTargetName(e){let t=this.targetNameIndex.get(e);return t?Array.from(t).filter(r=>r.inUse&&!r.freePending):[]}pickTarget(e){if(!e)return null;let t=this.findByTargetName(e);if(t.length===0)return null;let r=this.random.randomIndex(t);return t[r]??null}killBox(e){let t=_e(e);for(let r of this.pool)r===e||r===this.pool.world||!r.inUse||r.freePending||r.solid===0||r.svflags&2||nr(t,_e(r))&&(r.health=0,r.deadflag=2,this.free(r))}useTargets(e,t=null){if(e.delay>0){let r=this.spawn();r.classname="DelayedUse",r.target=e.target,r.killtarget=e.killtarget,r.message=e.message,r.think=n=>{this.useTargetsImmediate(n,t??e),this.free(n)},this.scheduleThink(r,this.currentTimeSeconds+e.delay);return}this.useTargetsImmediate(e,t??e)}runFrame(){this.thinkScheduler.runDueThinks(this.currentTimeSeconds),this.runTouches(),this.pool.flushFreeList()}createSnapshot(){let e=[];for(let t of this.pool){let r={};for(let n of dr){let s=t[n.name];switch(n.type){case"vec3":r[n.name]=po(s);break;case"entity":r[n.name]=s?.index??null;break;case"inventory":r[n.name]=yo(s);break;case"callback":r[n.name]=s?this.callbackToName.get(s)??null:null;break;default:r[n.name]=s??null;break}}e.push({index:t.index,fields:r})}return{timeSeconds:this.currentTimeSeconds,pool:this.pool.createSnapshot(),entities:e,thinks:this.thinkScheduler.snapshot()}}restore(e,t){this.currentTimeSeconds=e.timeSeconds,this.pool.restore(e.pool);let r=new Map;for(let s of this.pool)r.set(s.index,s);let n=[];for(let s of e.entities){let i=r.get(s.index);if(i)for(let[o,a]of Object.entries(s.fields)){let c=fo.get(o);if(!(!c||a===void 0))switch(c.type){case"vec3":re(i,o,vo(a));break;case"entity":n.push({entity:i,name:c.name,targetIndex:a});break;case"inventory":re(i,o,go(a));break;case"boolean":re(i,o,!!a);break;case"callback":if(a){let l=t?.get(a);l&&re(i,o,l)}break;default:re(i,o,a);break}}}for(let s of n){let i=s.targetIndex===null?null:r.get(s.targetIndex)??null;re(s.entity,s.name,i)}this.thinkScheduler.restore(e.thinks,s=>r.get(s))}runTouches(){let e=this.pool.world,t=[];for(let r of this.pool)r!==e&&(!r.inUse||r.freePending||r.solid===0||t.push(r));for(let r=0;r<t.length;r+=1){let n=t[r],s=null;for(let i=r+1;i<t.length;i+=1){let o=t[i];if(!n.touch&&!o.touch)continue;s||(s=_e(n));let a=_e(o);nr(s,a)&&(n.touch&&n.touch(n,o),o.touch&&o.touch(o,n))}}}registerTarget(e){if(!e.targetname)return;let t=this.targetNameIndex.get(e.targetname);t||(t=new Set,this.targetNameIndex.set(e.targetname,t)),t.add(e)}unregisterTarget(e){if(!e.targetname)return;let t=this.targetNameIndex.get(e.targetname);t&&(t.delete(e),t.size===0&&this.targetNameIndex.delete(e.targetname))}useTargetsImmediate(e,t){if(e.target)for(let r of this.findByTargetName(e.target))r!==e&&r.use?.(r,e,t);if(e.killtarget)for(let r of this.findByTargetName(e.killtarget))r!==e&&this.free(r)}};var _l=1/40;var Tl=new Map(at.map(e=>[e.name,e]));function So(e){return e.find(t=>t.classname==="info_player_start")}var mr=(e=>(e[e.Bullets=0]="Bullets",e[e.Shells=1]="Shells",e[e.Rockets=2]="Rockets",e[e.Grenades=3]="Grenades",e[e.Cells=4]="Cells",e[e.Slugs=5]="Slugs",e))(mr||{}),Al=Object.keys(mr).length/2;var wo=["prep","simulate","finish"],Eo=class{constructor(e){if(this.timeMs=0,this.frame=0,this.stageHandlers={prep:[],simulate:[],finish:[]},this.stageCounts={prep:0,simulate:0,finish:0},this.stageCompactionNeeded={prep:!1,simulate:!1,finish:!1},e)for(let t of wo){let r=e[t];r&&this.addStage(t,r)}}addStage(e,t){let r=this.stageHandlers[e];return r.push(t),this.stageCounts[e]+=1,()=>{let n=r.indexOf(t);n>=0&&r[n]&&(r[n]=void 0,this.stageCounts[e]-=1,this.stageCompactionNeeded[e]=!0)}}reset(e){this.timeMs=e,this.frame=0}advance(e){let t=this.timeMs;this.timeMs=t+e.deltaMs,this.frame=e.frame;let r={...e,timeMs:this.timeMs,previousTimeMs:t,deltaSeconds:e.deltaMs/1e3};if(this.runStage("prep",r),this.stageCounts.simulate===0)throw new Error("GameFrameLoop requires at least one simulate stage");return this.runStage("simulate",r),this.runStage("finish",r),r}runStage(e,t){let r=this.stageHandlers[e];for(let n=0;n<r.length;n+=1){let s=r[n];s&&s(t)}this.stageCompactionNeeded[e]&&this.compactStageHandlers(e)}compactStageHandlers(e){let t=this.stageHandlers[e],r=0;for(let n=0;n<t.length;n+=1){let s=t[n];s&&(t[r]=s,r+=1)}t.length=r,this.stageCompactionNeeded[e]=!1}get time(){return this.timeMs}get frameNumber(){return this.frame}},_o={frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0},To=class{constructor(){this.state=_o}start(e){let t=e/1e3;this.state={frameNumber:0,timeSeconds:t,previousTimeSeconds:t,deltaSeconds:0}}tick(e){return this.state={frameNumber:e.frame,timeSeconds:e.timeMs/1e3,previousTimeSeconds:e.previousTimeMs/1e3,deltaSeconds:e.deltaSeconds},this.state}get current(){return this.state}restore(e){this.state={...e}}};var zl=1<<24;var st=2,Ao=1;function C(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be an object`);return e}function k(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`${t} must be a finite number`);return e}function Te(e,t,r){return e===void 0?r:k(e,t)}function Ne(e,t){if(typeof e!="string")throw new Error(`${t} must be a string`);return e}function ze(e,t){if(!Array.isArray(e))throw new Error(`${t} must be an array`);for(let r of e)k(r,`${t} element`);return e}function zo(e){if(e===void 0)return{frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0};let t=C(e,"level");return{frameNumber:Te(t.frameNumber,"level.frameNumber",0),timeSeconds:Te(t.timeSeconds,"level.timeSeconds",0),previousTimeSeconds:Te(t.previousTimeSeconds,"level.previousTimeSeconds",0),deltaSeconds:Te(t.deltaSeconds,"level.deltaSeconds",0)}}function No(e){if(e===void 0)return new ar().getState();let t=C(e,"rng"),r=C(t.mt,"rng.mt"),n=ze(r.state,"rng.mt.state");return{mt:{index:k(r.index,"rng.mt.index"),state:n}}}function Mo(e){if(e===void 0)return[];if(!Array.isArray(e))throw new Error("thinks must be an array");return e.map((t,r)=>{let n=C(t,`thinks[${r}]`);return{time:k(n.time,`thinks[${r}].time`),entityIndex:k(n.entityIndex,`thinks[${r}].entityIndex`)}})}function Ro(e){if(e===void 0)return{};let t=C(e,"entity.fields"),r={};for(let[n,s]of Object.entries(t)){if(s===null){r[n]=null;continue}switch(typeof s){case"number":case"string":case"boolean":r[n]=s;break;default:{if(!Array.isArray(s)){let i=C(s,n),o={};for(let[a,c]of Object.entries(i))o[a]=k(c,`${n}.${a}`);r[n]=o;break}if(Array.isArray(s)&&s.length===3){let[i,o,a]=s;r[n]=[k(i,`${n}[0]`),k(o,`${n}[1]`),k(a,`${n}[2]`)];break}throw new Error(`Unsupported entity field value for ${n}`)}}}return r}function Lo(e){if(!Array.isArray(e))throw new Error("entities must be an array");return e.map((t,r)=>{let n=C(t,`entities[${r}]`);return{index:k(n.index,`entities[${r}].index`),fields:Ro(n.fields)}})}function Oo(e){let t=C(e,"pool");return{capacity:k(t.capacity,"pool.capacity"),activeOrder:ze(t.activeOrder,"pool.activeOrder"),freeList:ze(t.freeList,"pool.freeList"),pendingFree:ze(t.pendingFree,"pool.pendingFree")}}function bo(e){let t=C(e,"entities");return{timeSeconds:k(t.timeSeconds,"entities.timeSeconds"),pool:Oo(t.pool),entities:Lo(t.entities),thinks:Mo(t.thinks)}}function ko(e){if(e===void 0)return[];if(!Array.isArray(e))throw new Error("cvars must be an array");return e.map((t,r)=>{let n=C(t,`cvars[${r}]`);return{name:Ne(n.name,`cvars[${r}].name`),value:Ne(n.value,`cvars[${r}].value`),flags:k(n.flags,`cvars[${r}].flags`)}})}function Co(e){if(e===void 0)return[];if(!Array.isArray(e))throw new Error("configstrings must be an array");return e.map((t,r)=>Ne(t,`configstrings[${r}]`))}function Po(e){return e===void 0?{}:C(e,"gameState")}function fr(e,t={}){let{allowNewerVersion:r=!0}=t,n=typeof e=="string"?JSON.parse(e):e,s=C(n,"save"),i=s.version??st,o=k(i,"version");if(o<Ao)throw new Error(`Unsupported save version ${o}`);if(o>st&&!r)throw new Error(`Save version ${o} is newer than supported ${st}`);return{version:o,timestamp:k(s.timestamp,"timestamp"),map:Ne(s.map,"map"),difficulty:k(s.difficulty,"difficulty"),playtimeSeconds:k(s.playtimeSeconds,"playtimeSeconds"),gameState:Po(s.gameState),level:zo(s.level),rng:No(s.rng),entities:bo(s.entities),cvars:ko(s.cvars),configstrings:Co(s.configstrings),player:s.player?s.player:void 0}}var Nl=new Set(at.filter(e=>e.save).map(e=>e.name));var sr=globalThis.TextEncoder;function ne(e){return fr({...e},{allowNewerVersion:!0})}function Do(e){return sr?new sr().encode(JSON.stringify(e)).length:JSON.stringify(e).length}var Uo=class{constructor(){this.records=new Map}async init(){return Promise.resolve()}async put(e){let t={id:e.id,metadata:{...e.metadata},save:ne(e.save)};this.records.set(e.id,t)}async get(e){let t=this.records.get(e);return t?{id:t.id,metadata:{...t.metadata},save:ne(t.save)}:null}async delete(e){return this.records.delete(e)}async list(){return Array.from(this.records.values()).map(e=>({id:e.id,metadata:{...e.metadata},save:ne(e.save)}))}},Fo=class{constructor(e,t,r){this.indexedDB=e,this.dbName=t,this.storeName=r,this.db=null}async init(){this.db||(this.db=await new Promise((e,t)=>{let r=this.indexedDB.open(this.dbName,1);r.onupgradeneeded=()=>{r.result.createObjectStore(this.storeName,{keyPath:"id"})},r.onerror=()=>t(r.error??new Error("Failed to open IndexedDB")),r.onsuccess=()=>e(r.result)}))}async runTransaction(e,t){await this.init();let r=this.db;return new Promise((n,s)=>{let o=r.transaction(this.storeName,e).objectStore(this.storeName),a=t(o);a.onsuccess=()=>n(a.result),a.onerror=()=>s(a.error??new Error("IndexedDB request failed"))})}async put(e){await this.runTransaction("readwrite",t=>t.put(e))}async get(e){let t=await this.runTransaction("readonly",r=>r.get(e));return t?{id:t.id,metadata:{...t.metadata},save:ne(t.save)}:null}async delete(e){return await this.get(e)?(await this.runTransaction("readwrite",r=>r.delete(e)),!0):!1}async list(){return(await this.runTransaction("readonly",t=>t.getAll())).map(t=>({id:t.id,metadata:{...t.metadata},save:ne(t.save)}))}},ct=class ue{constructor(t={}){let{dbName:r=ue.DEFAULT_DB_NAME,storeName:n=ue.DEFAULT_STORE}=t,s=t.indexedDB??globalThis.indexedDB;s?this.adapter=new Fo(s,r,n):this.adapter=new Uo}async save(t,r,n={}){let s=ne(r),i={id:t,name:n.name??t,map:s.map,difficulty:s.difficulty,playtimeSeconds:s.playtimeSeconds,timestamp:s.timestamp,version:s.version,bytes:Do(s)};return await this.adapter.init(),await this.adapter.put({id:t,metadata:i,save:s}),i}async load(t,r={}){await this.adapter.init();let n=await this.adapter.get(t);if(!n)throw new Error(`Save slot ${t} not found`);return fr(n.save,r)}async delete(t){return await this.adapter.init(),this.adapter.delete(t)}async list(){return await this.adapter.init(),(await this.adapter.list()).map(r=>({...r.metadata})).sort((r,n)=>n.timestamp-r.timestamp||r.id.localeCompare(n.id))}async quickSave(t){return this.save(ue.QUICK_SLOT,t,{name:"Quick Save"})}async quickLoad(t={}){return this.load(ue.QUICK_SLOT,t)}};ct.DEFAULT_DB_NAME="quake2ts-saves";ct.DEFAULT_STORE="saves";ct.QUICK_SLOT="quicksave";var Ae={x:0,y:0,z:0};function pr(e,t,r,n){let s=n.gravity,i=new To,o=new Eo,a=new xo(r);o.addStage("prep",h=>{i.tick(h),a.beginFrame(i.current.timeSeconds)}),o.addStage("simulate",({deltaSeconds:h})=>{l={x:l.x+s.x*h,y:l.y+s.y*h,z:l.z+s.z*h},c={x:c.x+l.x*h,y:c.y+l.y*h,z:c.z+l.z*h},a.runFrame()});let c={...Ae},l={...Ae},u=h=>({frame:h,timeMs:o.time,state:{gravity:{...s},origin:{...c},velocity:{...l},level:{...i.current},entities:{activeCount:a.activeCount,worldClassname:a.world.classname}}}),d=h=>{o.reset(h),i.start(h),c={...Ae},l={...Ae},a.beginFrame(h/1e3),a.runFrame()};return{init(h){return d(h),u(0)},shutdown(){},spawnWorld(){let h=So(a);if(h){let m=a.spawn();m.classname="player",m.origin={...h.origin},m.angles={...h.angles},m.health=100,m.mins={x:-16,y:-16,z:-24},m.maxs={x:16,y:16,z:32},a.finalizeSpawn(m),c={...m.origin}}},frame(h,m){let p=o.advance(h),v=a.find(f=>f.classname==="player");if(m&&v){let f={forwardmove:m.forwardmove,sidemove:m.sidemove,upmove:m.upmove,buttons:m.buttons},y={origin:v.origin,velocity:v.velocity,onGround:!1,waterLevel:0,mins:v.mins,maxs:v.maxs},_=co(y,f,e,t);v.origin=_.origin,v.velocity=_.velocity}return u(p.frame)},entities:a,sound(h,m,p,v,f,y){a.sound(h,m,p,v,f,y)},centerprintf(h,m){r.centerprintf?.(h,m)},get time(){return i.current.timeSeconds}}}var vr={x:0,y:0,z:0};var Il=Math.PI/180;var Gl=Math.PI/180,Bl=180/Math.PI;var W=1,j=2;var ut=8,ht=16,Io=32;var Go=16384;var ke=65536,yr=1<<17,Bo=1<<18,Wo=1<<19,Vo=1<<20,Ho=1<<21,Ko=1<<22,Xo=1<<23,Wl=1<<24,Ce=1<<25,Yo=1<<26,Vl=1<<27,Hl=1<<28,Kl=1<<29,Pe=1<<30,Xl=1<<31;var Yl=1<<25,$l=1<<28,ql=1<<29,jl=1<<30,Jl=1<<31;var Zl=W|j,Ql=W|ke|j|Ce|Pe,eu=W|ke|j,tu=W|yr|j|Ce|Pe,ru=Io|ut|ht,nu=W|ht|ut,$o=W|Ce|Pe|j|Yo,su=Bo|Wo|Vo|Ho|Ko|Xo,iu=W|ut|ht|Ce|Pe,ou=W|ke|j,au=W|j,cu=W|ke|j|yr,lu=$o|Go;var uu=Number.MAX_SAFE_INTEGER-1;var gr=256;var qo=256,jo=8192,Jo=2048,Zo=512,Qo=256,ea=gr*2,ta=256,lt=32;var xr=(e=>(e[e.Name=0]="Name",e[e.CdTrack=1]="CdTrack",e[e.Sky=2]="Sky",e[e.SkyAxis=3]="SkyAxis",e[e.SkyRotate=4]="SkyRotate",e[e.StatusBar=5]="StatusBar",e[e.AirAccel=59]="AirAccel",e[e.MaxClients=60]="MaxClients",e[e.MapChecksum=61]="MapChecksum",e[e.Models=62]="Models",e[e.Sounds=62+jo]="Sounds",e[e.Images=e.Sounds+Jo]="Images",e[e.Lights=e.Images+Zo]="Lights",e[e.ShadowLights=e.Lights+qo]="ShadowLights",e[e.Items=e.ShadowLights+ta]="Items",e[e.PlayerSkins=e.Items+Qo]="PlayerSkins",e[e.General=e.PlayerSkins+gr]="General",e[e.WheelWeapons=e.General+ea]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+lt]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+lt]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+lt]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(xr||{}),hu=xr.MaxConfigStrings;function ra(){let e=(a,c)=>({start:a,end:c,fraction:1,endpos:c,allsolid:!1,startsolid:!1}),t=a=>0,r=tr({trace:e}),s=pr(e,t,{sound:(a,c,l)=>console.log(`Sound played: ${l}`),centerprintf(a,c){let l=document.createElement("div");l.style.position="absolute",l.style.top="50%",l.style.left="50%",l.style.transform="translate(-50%, -50%)",l.style.color="white",l.style.fontSize="2em",l.style.fontFamily="sans-serif",l.innerText=c,document.body.appendChild(l),setTimeout(()=>document.body.removeChild(l),3e3)}},{gravity:vr}),i=$t({engine:{trace:e}}),o=er(r,s,i);return o.start(),{engine:r,game:s,client:i,runtime:o}}return Ar(na);})();
|
|
2
2
|
//# sourceMappingURL=index.global.js.map
|