quake2ts 0.0.44 → 0.0.46

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.
Files changed (39) hide show
  1. package/apps/viewer/dist/browser/index.global.js +1 -1
  2. package/apps/viewer/dist/browser/index.global.js.map +1 -1
  3. package/apps/viewer/dist/cjs/index.cjs.map +1 -1
  4. package/apps/viewer/dist/esm/index.js.map +1 -1
  5. package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -1
  6. package/package.json +1 -1
  7. package/packages/client/dist/browser/index.global.js.map +1 -1
  8. package/packages/client/dist/cjs/index.cjs.map +1 -1
  9. package/packages/client/dist/esm/index.js.map +1 -1
  10. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  11. package/packages/engine/dist/browser/index.global.js +69 -10
  12. package/packages/engine/dist/browser/index.global.js.map +1 -1
  13. package/packages/engine/dist/cjs/index.cjs +781 -5
  14. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  15. package/packages/engine/dist/esm/index.js +763 -5
  16. package/packages/engine/dist/esm/index.js.map +1 -1
  17. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  18. package/packages/engine/dist/types/index.d.ts +2 -0
  19. package/packages/engine/dist/types/index.d.ts.map +1 -1
  20. package/packages/engine/dist/types/render/md3Pipeline.d.ts +79 -0
  21. package/packages/engine/dist/types/render/md3Pipeline.d.ts.map +1 -0
  22. package/packages/engine/dist/types/render/particleSystem.d.ts +105 -0
  23. package/packages/engine/dist/types/render/particleSystem.d.ts.map +1 -0
  24. package/packages/game/dist/browser/index.global.js.map +1 -1
  25. package/packages/game/dist/cjs/index.cjs.map +1 -1
  26. package/packages/game/dist/esm/index.js.map +1 -1
  27. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  28. package/packages/shared/dist/browser/index.global.js +1 -1
  29. package/packages/shared/dist/browser/index.global.js.map +1 -1
  30. package/packages/shared/dist/cjs/index.cjs +65 -0
  31. package/packages/shared/dist/cjs/index.cjs.map +1 -1
  32. package/packages/shared/dist/esm/index.js +61 -0
  33. package/packages/shared/dist/esm/index.js.map +1 -1
  34. package/packages/shared/dist/tsconfig.tsbuildinfo +1 -1
  35. package/packages/shared/dist/types/index.d.ts +1 -0
  36. package/packages/shared/dist/types/index.d.ts.map +1 -1
  37. package/packages/shared/dist/types/math/mat4.d.ts +7 -0
  38. package/packages/shared/dist/types/math/mat4.d.ts.map +1 -0
  39. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";var Quake2=(()=>{var oe=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var yt=(e,t)=>{for(var n in t)oe(e,n,{get:t[n],enumerable:!0})},vt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of mt(t))!pt.call(e,s)&&s!==n&&oe(e,s,{get:()=>t[s],enumerable:!(r=ft(t,s))||r.enumerable});return e};var gt=e=>vt(oe({},"__esModule",{value:!0}),e);var Hr={};yt(Hr,{bootstrapViewer:()=>Wr});var xt={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 D(e,t){return{x:e.x*t,y:e.y*t,z:e.z*t}}function P(e,t){return e.x*t.x+e.y*t.y+e.z*t.z}function St(e){return P(e,e)}function G(e){return Math.sqrt(St(e))}function ke(e){let t=G(e);return t===0?e:D(e,1/t)}var Ce=0,Pe=1,De=2,Et=Math.PI/180,$r=180/Math.PI;function ae(e,t){switch(t){case Ce:return e.x;case Pe:return e.y;case De:default:return e.z}}function ce(e){return e*Et}function Oe(e){let t=e%360;return t<0?360+t:t}function Ue(e){let t=ce(ae(e,Pe)),n=ce(ae(e,Ce)),r=ce(ae(e,De)),s=Math.sin(t),o=Math.cos(t),i=Math.sin(n),a=Math.cos(n),u=Math.sin(r),l=Math.cos(r),c={x:a*o,y:a*s,z:-i},m={x:-u*i*o-l*-s,y:-u*i*s-l*o,z:-u*a},p={x:l*i*o-u*-s,y:l*i*s-u*o,z:l*a};return{forward:c,right:m,up:p}}var y=1,T=2;var he=8,de=16,Tt=32;var wt=16384;var V=65536,Fe=1<<17,_t=1<<18,At=1<<19,zt=1<<20,Nt=1<<21,Rt=1<<22,Lt=1<<23,Yr=1<<24,W=1<<25,Ot=1<<26,jr=1<<27,qr=1<<28,Jr=1<<29,H=1<<30,Zr=1<<31;var Qr=1<<25,es=1<<28,ts=1<<29,ns=1<<30,rs=1<<31,ss=y|T,is=y|V|T|W|H,os=y|V|T,as=y|Fe|T|W|H,cs=Tt|he|de,us=y|de|he,Mt=y|W|H|T|Ot,ls=_t|At|zt|Nt|Rt|Lt,hs=y|he|de|W|H,ds=y|V|T,fs=y|T,ms=y|V|T|Fe,ps=Mt|wt,ys=Number.MAX_SAFE_INTEGER-1,Ie=256,bt=256,kt=8192,Ct=2048,Pt=512,Dt=256,Ut=Ie*2,Ft=256,ue=32,Be=(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+kt]="Sounds",e[e.Images=e.Sounds+Ct]="Images",e[e.Lights=e.Images+Pt]="Lights",e[e.ShadowLights=e.Lights+bt]="ShadowLights",e[e.Items=e.ShadowLights+Ft]="Items",e[e.PlayerSkins=e.Items+Dt]="PlayerSkins",e[e.General=e.PlayerSkins+Ie]="General",e[e.WheelWeapons=e.General+Ut]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+ue]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+ue]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+ue]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(Be||{}),vs=Be.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[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))(E||{});function O(e,t){return(e&t)!==0}var Ge=(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))(Ge||{}),R=(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))(R||{});function It(e){let{velocity:t,frametime:n,onGround:r,groundIsSlick:s,onLadder:o,waterlevel:i,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&&!s||o){let k=c<u?u:c;m+=k*a*n}i>0&&!o&&(m+=c*l*i*n);let p=c-m;if(p<0&&(p=0),p===c)return t;let z=p/c;return D(t,z)}function Me(e){let{velocity:t,wishdir:n,wishspeed:r,accel:s,frametime:o}=e,i=P(t,n),a=r-i;if(a<=0)return t;let u=s*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 Bt(e){let{velocity:t,wishdir:n,wishspeed:r,accel:s,frametime:o}=e,i=Math.min(r,30),a=P(t,n),u=i-a;if(u<=0)return t;let l=s*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 Gt(e){let{forward:t,right:n,cmd:r,maxSpeed:s}=e,o={x:t.x*r.forwardmove+n.x*r.sidemove,y:t.y*r.forwardmove+n.y*r.sidemove,z:0},i=G(o);if(i>s){let a=s/i;o=D(o,a),i=s}return{wishdir:i===0?o:ke(o),wishspeed:i}}function Vt(e){let{forward:t,right:n,cmd:r,maxSpeed:s}=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 i=G(o);if(i>s){let a=s/i;o=D(o,a),i=s}return i*=.5,{wishdir:i===0?o:ke(o),wishspeed:i}}function Wt(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Ht(e){return e>89&&e<180?89:e<271&&e>=180?271:e}function Ve(e){let{pmFlags:t,cmdAngles:n,deltaAngles:r}=e,s;(t&32)!==0?s={x:0,y:n.y+r.y,z:0}:(s=Wt(n,r),s={...s,x:Ht(s.x)});let o=Ue(s);return{viewangles:s,...o}}var Kt={pmFriction:6,pmStopSpeed:100,pmAccelerate:10,pmAirAccelerate:1,pmWaterAccelerate:4,pmWaterFriction:1,pmMaxSpeed:300,pmDuckSpeed:100,pmWaterSpeed:400,groundIsSlick:!1},Xt=800,L={x:0,y:0,z:0},$t=250;function C(){return{origin:L,velocity:L,viewangles:L,pmFlags:E.OnGround,pmType:Ge.Normal,waterlevel:B.None,gravity:Xt,deltaAngles:L}}function be(e){return e?{...C(),...e,origin:{...e.origin},velocity:{...e.velocity},viewangles:{...e.viewangles},deltaAngles:e.deltaAngles?{...e.deltaAngles}:L}:C()}function N(e,t,n){return e+(t-e)*n}function le(e,t,n){let r=Oe(t-e);return r>180&&(r-=360),Oe(e+r*n)}function Yt(e,t,n){let r=Math.max(0,Math.min(n,1));return{origin:{x:N(e.origin.x,t.origin.x,r),y:N(e.origin.y,t.origin.y,r),z:N(e.origin.z,t.origin.z,r)},velocity:{x:N(e.velocity.x,t.velocity.x,r),y:N(e.velocity.y,t.velocity.y,r),z:N(e.velocity.z,t.velocity.z,r)},viewangles:{x:le(e.viewangles.x,t.viewangles.x,r),y:le(e.viewangles.y,t.viewangles.y,r),z:le(e.viewangles.z,t.viewangles.z,r)},pmFlags:t.pmFlags,pmType:t.pmType,waterlevel:t.waterlevel,gravity:t.gravity,deltaAngles:t.deltaAngles}}function jt(e,t,n){let r=Math.min(Math.max(t.msec,0),$t)/1e3,s=O(e.pmFlags,E.OnGround),o=O(e.pmFlags,E.OnLadder),i=It({velocity:e.velocity,frametime:r,onGround:s,groundIsSlick:n.groundIsSlick,onLadder:o,waterlevel:e.waterlevel,pmFriction:n.pmFriction,pmStopSpeed:n.pmStopSpeed,pmWaterFriction:n.pmWaterFriction}),{viewangles:a,forward:u,right:l}=Ve({pmFlags:e.pmFlags,cmdAngles:t.angles,deltaAngles:e.deltaAngles??L}),c=e.waterlevel>B.None?Vt({forward:u,right:l,cmd:t,maxSpeed:n.pmWaterSpeed}):Gt({forward:u,right:l,cmd:t,maxSpeed:n.pmMaxSpeed});if(e.waterlevel>B.None)i=Me({velocity:i,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmWaterAccelerate,frametime:r});else if(s||o){let z=O(e.pmFlags,E.Ducked)?n.pmDuckSpeed:n.pmMaxSpeed,k=c.wishspeed>z?{wishdir:c.wishdir,wishspeed:z}:c;i=Me({velocity:i,wishdir:k.wishdir,wishspeed:k.wishspeed,accel:n.pmAccelerate,frametime:r})}else i=Bt({velocity:i,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmAirAccelerate,frametime:r}),i={...i,z:i.z-e.gravity*r};let m=D(i,r),p=I(e.origin,m);return{...e,origin:p,velocity:i,viewangles:a}}var qt=class{constructor(e={}){this.baseFrame={frame:0,timeMs:0,state:C()},this.commands=[],this.predicted=C(),this.settings={...Kt,...e},this.predicted=this.baseFrame.state??C()}setAuthoritative(e){let t=be(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=be(this.baseFrame.state);for(let t of this.commands)e=jt(e,t,this.settings);return this.predicted=e,e}},Jt={runPitch:.002,runRoll:.005,bobUp:.005,bobPitch:.002,bobRoll:.002,maxBobHeight:6,maxBobAngle:1.2};function Zt(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 Qt(e,t,n){return t?e>210?n/400:e>100?n/800:n/1600:0}function en(e,t,n,r,s){if(t<5)return{bobTime:0,bobCycle:0,bobCycleRun:0,bobFracSin:0};let o=Qt(t,r,s),i=e+o,u=O(n,E.Ducked)&&r?i*4:i;return{bobTime:i,bobCycle:Math.floor(u),bobCycleRun:Math.floor(i),bobFracSin:Math.abs(Math.sin(u*Math.PI))}}var tn=class{constructor(e={}){this.bobTime=0,this.bobCycle=0,this.bobCycleRun=0,this.bobFracSin=0,this.settings={...Jt,...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}=Ue(Ve({pmFlags:e.pmFlags,cmdAngles:e.viewangles,deltaAngles:e.deltaAngles??xt}).viewangles),s=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),o=O(e.pmFlags,E.OnGround),i=en(this.bobTime,s,e.pmFlags,o,t);this.bobTime=i.bobTime,this.bobCycle=i.bobCycle,this.bobCycleRun=i.bobCycleRun,this.bobFracSin=i.bobFracSin;let a=P(e.velocity,n)*this.settings.runPitch,u=P(e.velocity,r)*this.settings.runRoll,l=this.bobFracSin*this.settings.bobPitch*s,c=this.bobFracSin*this.settings.bobRoll*s;O(e.pmFlags,E.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*s*this.settings.bobUp,this.settings.maxBobHeight),p=0,z=0;if(this.kick&&this.kick.remainingMs>0){let Le=Math.max(0,Math.min(1,this.kick.remainingMs/this.kick.durationMs));p+=Le*this.kick.pitch,z+=Le*this.kick.roll,this.kick.remainingMs=Math.max(0,this.kick.remainingMs-t),this.kick.remainingMs===0&&(this.kick=void 0)}let Re={angles:{x:a+p,y:0,z:u+z},offset:Zt({x:0,y:0,z:m}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:s};return this.lastSample=Re,Re}};function nn(e){return e.trim().toLowerCase()}var We=(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))(We||{}),gs={"+attack":R.Attack,"+use":R.Use,"+holster":R.Holster,"+jump":R.Jump,"+crouch":R.Crouch},xs=new Map(Object.values(We).map(e=>[nn(e),e]));function He(e){let t=new qt,n=new tn,r,s,o;return{init(i){r=i,i?.state&&t.setAuthoritative(i),e.engine.trace({x:0,y:0,z:0},{x:1,y:0,z:0})},predict(i){return t.enqueueCommand(i)},render(i){i.latest?.state&&(t.setAuthoritative(i.latest),r=i.latest),i.previous?.state&&i.latest?.state?s=Yt(i.previous.state,i.latest.state,i.alpha):s=i.latest?.state??i.previous?.state??t.getPredictedState();let a=i.latest&&i.previous?Math.max(0,i.latest.timeMs-i.previous.timeMs):0;o=n.sample(s,a)},shutdown(){r=void 0,s=void 0},get prediction(){return t},get lastRendered(){return s},get view(){return n},get lastView(){return o}}}var Ke=25,rn=5,sn=()=>typeof performance<"u"?performance.now():Date.now(),on=e=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>e()):setTimeout(e,Ke)},Xe=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(),o=this.lastTimeMs===void 0?0:s-this.lastTimeMs;this.lastTimeMs=s,this.advance(o,s),this.running&&this.options.schedule(this.tick)};let n=t.fixedDeltaMs??Ke,r=t.maxSubSteps??rn;this.options={fixedDeltaMs:n,maxSubSteps:r,maxDeltaMs:t.maxDeltaMs??n*r,startTimeMs:t.startTimeMs,now:t.now??sn,schedule:t.schedule??on}}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 s=this.options.fixedDeltaMs===0?0:this.accumulatorMs/this.options.fixedDeltaMs;this.callbacks.render?.({alpha:s,nowMs:t,accumulatorMs:this.accumulatorMs,frame:this.frame})}},an=class{constructor(e,t,n={}){this.game=e,this.client=t,this.started=!1,this.stepSimulation=s=>{this.previousFrame=this.latestFrame,this.latestFrame=this.game.frame(s)},this.renderClient=s=>{this.client&&this.client.render({...s,previous:this.previousFrame,latest:this.latestFrame})};let r=n.loop?.now?.()??Date.now();this.startTimeMs=n.startTimeMs??n.loop?.startTimeMs??r,this.loop=new Xe({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 ws=Math.PI/180;var _s=Math.PI/180,As=180/Math.PI,v=1,w=2;var ye=8,ve=16,cn=32;var un=16384;var K=65536,$e=1<<17,ln=1<<18,hn=1<<19,dn=1<<20,fn=1<<21,mn=1<<22,pn=1<<23,zs=1<<24,X=1<<25,yn=1<<26,Ns=1<<27,Rs=1<<28,Ls=1<<29,$=1<<30,Os=1<<31;var Ms=1<<25,bs=1<<28,ks=1<<29,Cs=1<<30,Ps=1<<31,Ds=v|w,Us=v|K|w|X|$,Fs=v|K|w,Is=v|$e|w|X|$,Bs=cn|ye|ve,Gs=v|ve|ye,vn=v|X|$|w|yn,Vs=ln|hn|dn|fn|mn|pn,Ws=v|ye|ve|X|$,Hs=v|K|w,Ks=v|w,Xs=v|K|w|$e,$s=vn|un,Ys=Number.MAX_SAFE_INTEGER-1;var Ye=256,gn=256,xn=8192,Sn=2048,En=512,Tn=256,wn=Ye*2,_n=256,fe=32;var je=(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+Sn]="Images",e[e.Lights=e.Images+En]="Lights",e[e.ShadowLights=e.Lights+gn]="ShadowLights",e[e.Items=e.ShadowLights+_n]="Items",e[e.PlayerSkins=e.Items+Tn]="PlayerSkins",e[e.General=e.PlayerSkins+Ye]="General",e[e.WheelWeapons=e.General+wn]="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))(je||{}),js=je.MaxConfigStrings;var An=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 qe(e,t,n,r){return new An(e,new an(t,n,r))}function zn(){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 qs=zn();var Js=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 pe=4,me=7*pe,Zs=[{index:0,size:3,type:5126,stride:me,offset:0},{index:1,size:2,type:5126,stride:me,offset:3*pe},{index:2,size:2,type:5126,stride:me,offset:5*pe}];var Qs=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 Je(e){return{init(){e.trace({x:0,y:0,z:0},{x:0,y:0,z:0})},shutdown(){},createMainLoop(t,n){return new Xe(t,n)}}}var Nn={x:0,y:0,z:0},si=Math.PI/180;var ii=Math.PI/180,oi=180/Math.PI;var g=624,Rn=397,Ln=2567483615,On=2147483648,Mn=2147483647,ge=4294967296,bn=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]&On|this.state[(e+1)%g]&Mn,n=this.state[(e+Rn)%g]^t>>>1;(t&1)!==0&&(n^=Ln),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)}},tt=class{constructor(e={}){this.mt=new bn(e.seed)}frandom(){return this.mt.nextUint32()/ge}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=ge-ge%n,s;do s=this.mt.nextUint32();while(s>=r);return e+s%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 kn(e){return new tt(e)}var x=1,_=2;var Ee=8,Te=16,Cn=32;var Pn=16384;var Q=65536,nt=1<<17,Dn=1<<18,Un=1<<19,Fn=1<<20,In=1<<21,Bn=1<<22,Gn=1<<23,ai=1<<24,ee=1<<25,Vn=1<<26,ci=1<<27,ui=1<<28,li=1<<29,te=1<<30,hi=1<<31;var di=1<<25,fi=1<<28,mi=1<<29,pi=1<<30,yi=1<<31,vi=x|_,gi=x|Q|_|ee|te,xi=x|Q|_,Si=x|nt|_|ee|te,Ei=Cn|Ee|Te,Ti=x|Te|Ee,Wn=x|ee|te|_|Vn,wi=Dn|Un|Fn|In|Bn|Gn,_i=x|Ee|Te|ee|te,Ai=x|Q|_,zi=x|_,Ni=x|Q|_|nt,Ri=Wn|Pn,Li=Number.MAX_SAFE_INTEGER-1;var rt=256,Hn=256,Kn=8192,Xn=2048,$n=512,Yn=256,jn=rt*2,qn=256,xe=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+Kn]="Sounds",e[e.Images=e.Sounds+Xn]="Images",e[e.Lights=e.Images+$n]="Lights",e[e.ShadowLights=e.Lights+Hn]="ShadowLights",e[e.Items=e.ShadowLights+qn]="Items",e[e.PlayerSkins=e.Items+Yn]="PlayerSkins",e[e.General=e.PlayerSkins+rt]="General",e[e.WheelWeapons=e.General+jn]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+xe]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+xe]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+xe]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(st||{}),Oi=st.MaxConfigStrings;var Jn={...Nn};function h(){return{...Jn}}var Ze=Object.freeze({aiflags: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={...Ze},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={...Ze}}},we=[{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,M=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!==M&&this.freeList.push(n);let t=this.entities[M];t.inUse=!0,t.classname="worldspawn",this.activeHead=t}get world(){return this.entities[M]}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===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(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,s)=>{if(r<0||r>=this.entities.length)throw new Error(`Invalid entity index ${r} in ${s}`);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 s=this.entities[e.activeOrder[r]];s.inUse=!0,this.link(s)}for(let r of e.pendingFree){let s=this.entities[r];s.inUse=!1,s.freePending=!0,s.linkNext=null,s.linkPrevious=null,this.pendingFree.push(r)}for(let r of e.freeList){let s=this.entities[r];s.inUse=!1,s.freePending=!1,s.linkNext=null,s.linkPrevious=null,this.freeList.push(r)}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}},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 Y(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 Qe(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 it=we.filter(e=>e.save),nr=new Map(it.map(e=>[e.name,e]));function rr(e){return[e.x,e.y,e.z]}function sr(e){let t=e;if(!Array.isArray(t)||t.length!==3)throw new Error("Invalid vec3 serialization");let[n,r,s]=t;return{x:n,y:r,z:s}}function U(e,t,n){e[t]=n}function ir(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){this.targetNameIndex=new Map,this.random=kn(),this.currentTimeSeconds=0,this.pool=new er(e),this.thinkScheduler=new tr}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)}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=Y(e);for(let n of this.pool)n===e||n===this.pool.world||!n.inUse||n.freePending||n.solid===0||n.svflags&2||Qe(t,Y(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 it){let s=t[r.name];switch(r.type){case"vec3":n[r.name]=rr(s);break;case"entity":n[r.name]=s?.index??null;break;case"inventory":n[r.name]=ir(s);break;default:n[r.name]=s??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){this.currentTimeSeconds=e.timeSeconds,this.pool.restore(e.pool);let t=new Map;for(let r of this.pool)t.set(r.index,r);let n=[];for(let r of e.entities){let s=t.get(r.index);if(s)for(let[o,i]of Object.entries(r.fields)){let a=nr.get(o);if(!(!a||i===void 0))switch(a.type){case"vec3":U(s,o,sr(i));break;case"entity":n.push({entity:s,name:a.name,targetIndex:i});break;case"inventory":U(s,o,or(i));break;case"boolean":U(s,o,!!i);break;default:U(s,o,i);break}}}for(let r of n){let s=r.targetIndex===null?null:t.get(r.targetIndex)??null;U(r.entity,r.name,s)}this.thinkScheduler.restore(e.thinks,r=>t.get(r))}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],s=null;for(let o=n+1;o<t.length;o+=1){let i=t[o];if(!r.touch&&!i.touch)continue;s||(s=Y(r));let a=Y(i);Qe(s,a)&&(r.touch&&r.touch(r,i),i.touch&&i.touch(i,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 Mi=1/40;var bi=new Map(we.map(e=>[e.name,e]));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 s=n[r];s&&s(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 s=t[r];s&&(t[n]=s,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 ki=1<<24;var Se=1,dr=1;function f(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 fr(e){if(e===void 0)return{frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0};let t=f(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 mr(e){if(e===void 0)return new tt().getState();let t=f(e,"rng"),n=f(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=f(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=f(e,"entity.fields"),n={};for(let[r,s]of Object.entries(t)){if(s===null){n[r]=null;continue}switch(typeof s){case"number":case"string":case"boolean":n[r]=s;break;default:{if(!Array.isArray(s)){let o=f(s,r),i={};for(let[a,u]of Object.entries(o))i[a]=d(u,`${r}.${a}`);n[r]=i;break}if(Array.isArray(s)&&s.length===3){let[o,i,a]=s;n[r]=[d(o,`${r}[0]`),d(i,`${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=f(t,`entities[${n}]`);return{index:d(r.index,`entities[${n}].index`),fields:yr(r.fields)}})}function gr(e){let t=f(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=f(e,"entities");return{timeSeconds:d(t.timeSeconds,"entities.timeSeconds"),pool:gr(t.pool),entities:vr(t.entities),thinks:pr(t.thinks)}}function Sr(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=f(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 Er(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 Tr(e){return e===void 0?{}:f(e,"gameState")}function ot(e,t={}){let{allowNewerVersion:n=!0}=t,r=typeof e=="string"?JSON.parse(e):e,s=f(r,"save"),o=s.version??Se,i=d(o,"version");if(i<dr)throw new Error(`Unsupported save version ${i}`);if(i>Se&&!n)throw new Error(`Save version ${i} is newer than supported ${Se}`);return{version:i,timestamp:d(s.timestamp,"timestamp"),map:Z(s.map,"map"),difficulty:d(s.difficulty,"difficulty"),playtimeSeconds:d(s.playtimeSeconds,"playtimeSeconds"),gameState:Tr(s.gameState),level:fr(s.level),rng:mr(s.rng),entities:xr(s.entities),cvars:Sr(s.cvars),configstrings:Er(s.configstrings)}}var Ci=new Set(we.filter(e=>e.save).map(e=>e.name));var et=globalThis.TextEncoder;function b(e){return ot({...e},{allowNewerVersion:!0})}function wr(e){return et?new et().encode(JSON.stringify(e)).length:JSON.stringify(e).length}var _r=class{constructor(){this.records=new Map}async init(){return Promise.resolve()}async put(e){let t={id:e.id,metadata:{...e.metadata},save:b(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:b(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:b(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,s)=>{let i=n.transaction(this.storeName,e).objectStore(this.storeName),a=t(i);a.onsuccess=()=>r(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",n=>n.get(e));return t?{id:t.id,metadata:{...t.metadata},save:b(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:b(t.save)}))}},_e=class F{constructor(t={}){let{dbName:n=F.DEFAULT_DB_NAME,storeName:r=F.DEFAULT_STORE}=t,s=t.indexedDB??globalThis.indexedDB;s?this.adapter=new Ar(s,n,r):this.adapter=new _r}async save(t,n,r={}){let s=b(n),o={id:t,name:r.name??t,map:s.map,difficulty:s.difficulty,playtimeSeconds:s.playtimeSeconds,timestamp:s.timestamp,version:s.version,bytes:wr(s)};return await this.adapter.init(),await this.adapter.put({id:t,metadata:o,save:s}),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 ot(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)}};_e.DEFAULT_DB_NAME="quake2ts-saves";_e.DEFAULT_STORE="saves";_e.QUICK_SLOT="quicksave";var at=(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))(at||{}),Pi=Object.keys(at).length/2;var q={x:0,y:0,z:0};function ct(e,t){let n=t.gravity,r=new hr,s=new ur,o=new ar;s.addStage("prep",c=>{r.tick(c),o.beginFrame(r.current.timeSeconds)}),s.addStage("simulate",({deltaSeconds:c})=>{a={x:a.x+n.x*c,y:a.y+n.y*c,z:a.z+n.z*c},i={x:i.x+a.x*c,y:i.y+a.y*c,z:i.z+a.z*c},o.runFrame()});let i={...q},a={...q},u=c=>({frame:c,timeMs:s.time,state:{gravity:{...n},origin:{...i},velocity:{...a},level:{...r.current},entities:{activeCount:o.activeCount,worldClassname:o.world.classname}}}),l=c=>{s.reset(c),r.start(c),i={...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=s.advance(c);return u(m.frame)},entities:o}}var ne={x:0,y:0,z:0};var $i=Math.PI/180;var Yi=Math.PI/180,ji=180/Math.PI;var S=1,A=2;var ze=8,Ne=16,zr=32;var Nr=16384;var re=65536,ut=1<<17,Rr=1<<18,Lr=1<<19,Or=1<<20,Mr=1<<21,br=1<<22,kr=1<<23,qi=1<<24,se=1<<25,Cr=1<<26,Ji=1<<27,Zi=1<<28,Qi=1<<29,ie=1<<30,eo=1<<31;var to=1<<25,no=1<<28,ro=1<<29,so=1<<30,io=1<<31;var oo=S|A,ao=S|re|A|se|ie,co=S|re|A,uo=S|ut|A|se|ie,lo=zr|ze|Ne,ho=S|Ne|ze,Pr=S|se|ie|A|Cr,fo=Rr|Lr|Or|Mr|br|kr,mo=S|ze|Ne|se|ie,po=S|re|A,yo=S|A,vo=S|re|A|ut,go=Pr|Nr;var xo=Number.MAX_SAFE_INTEGER-1;var lt=256;var Dr=256,Ur=8192,Fr=2048,Ir=512,Br=256,Gr=lt*2,Vr=256,Ae=32;var 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+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+lt]="General",e[e.WheelWeapons=e.General+Gr]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+Ae]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+Ae]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+Ae]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(ht||{}),So=ht.MaxConfigStrings;function Wr(){let e=Je({trace(s,o){return{start:s,end:o,fraction:1}}}),t=ct({trace(s,o){return{start:s,end:o,fraction:1}}},{gravity:ne}),n=He({engine:{trace:()=>({start:ne,end:ne,fraction:1})}}),r=qe(e,t,n);return r.start(),{engine:e,game:t,client:n,runtime:r}}return gt(Hr);})();
1
+ "use strict";var Quake2=(()=>{var oe=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var yt=(e,t)=>{for(var n in t)oe(e,n,{get:t[n],enumerable:!0})},vt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of mt(t))!pt.call(e,s)&&s!==n&&oe(e,s,{get:()=>t[s],enumerable:!(r=ft(t,s))||r.enumerable});return e};var gt=e=>vt(oe({},"__esModule",{value:!0}),e);var Hr={};yt(Hr,{bootstrapViewer:()=>Wr});var xt={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 D(e,t){return{x:e.x*t,y:e.y*t,z:e.z*t}}function P(e,t){return e.x*t.x+e.y*t.y+e.z*t.z}function St(e){return P(e,e)}function G(e){return Math.sqrt(St(e))}function Ce(e){let t=G(e);return t===0?e:D(e,1/t)}var ke=0,Pe=1,De=2,_t=Math.PI/180,Yr=180/Math.PI;function ae(e,t){switch(t){case ke:return e.x;case Pe:return e.y;case De:default:return e.z}}function ce(e){return e*_t}function Me(e){let t=e%360;return t<0?360+t:t}function Fe(e){let t=ce(ae(e,Pe)),n=ce(ae(e,ke)),r=ce(ae(e,De)),s=Math.sin(t),o=Math.cos(t),i=Math.sin(n),a=Math.cos(n),u=Math.sin(r),l=Math.cos(r),c={x:a*o,y:a*s,z:-i},m={x:-u*i*o-l*-s,y:-u*i*s-l*o,z:-u*a},p={x:l*i*o-u*-s,y:l*i*s-u*o,z:l*a};return{forward:c,right:m,up:p}}var y=1,E=2;var he=8,de=16,Et=32;var wt=16384;var V=65536,Ue=1<<17,At=1<<18,Tt=1<<19,zt=1<<20,Nt=1<<21,Rt=1<<22,Lt=1<<23,$r=1<<24,W=1<<25,Mt=1<<26,jr=1<<27,qr=1<<28,Jr=1<<29,H=1<<30,Zr=1<<31;var Qr=1<<25,es=1<<28,ts=1<<29,ns=1<<30,rs=1<<31,ss=y|E,is=y|V|E|W|H,os=y|V|E,as=y|Ue|E|W|H,cs=Et|he|de,us=y|de|he,Ot=y|W|H|E|Mt,ls=At|Tt|zt|Nt|Rt|Lt,hs=y|he|de|W|H,ds=y|V|E,fs=y|E,ms=y|V|E|Ue,ps=Ot|wt,ys=Number.MAX_SAFE_INTEGER-1,Ie=256,bt=256,Ct=8192,kt=2048,Pt=512,Dt=256,Ft=Ie*2,Ut=256,ue=32,Be=(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+kt]="Images",e[e.Lights=e.Images+Pt]="Lights",e[e.ShadowLights=e.Lights+bt]="ShadowLights",e[e.Items=e.ShadowLights+Ut]="Items",e[e.PlayerSkins=e.Items+Dt]="PlayerSkins",e[e.General=e.PlayerSkins+Ie]="General",e[e.WheelWeapons=e.General+Ft]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+ue]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+ue]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+ue]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(Be||{}),vs=Be.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 M(e,t){return(e&t)!==0}var Ge=(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))(Ge||{}),R=(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))(R||{});function It(e){let{velocity:t,frametime:n,onGround:r,groundIsSlick:s,onLadder:o,waterlevel:i,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&&!s||o){let C=c<u?u:c;m+=C*a*n}i>0&&!o&&(m+=c*l*i*n);let p=c-m;if(p<0&&(p=0),p===c)return t;let z=p/c;return D(t,z)}function Oe(e){let{velocity:t,wishdir:n,wishspeed:r,accel:s,frametime:o}=e,i=P(t,n),a=r-i;if(a<=0)return t;let u=s*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 Bt(e){let{velocity:t,wishdir:n,wishspeed:r,accel:s,frametime:o}=e,i=Math.min(r,30),a=P(t,n),u=i-a;if(u<=0)return t;let l=s*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 Gt(e){let{forward:t,right:n,cmd:r,maxSpeed:s}=e,o={x:t.x*r.forwardmove+n.x*r.sidemove,y:t.y*r.forwardmove+n.y*r.sidemove,z:0},i=G(o);if(i>s){let a=s/i;o=D(o,a),i=s}return{wishdir:i===0?o:Ce(o),wishspeed:i}}function Vt(e){let{forward:t,right:n,cmd:r,maxSpeed:s}=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 i=G(o);if(i>s){let a=s/i;o=D(o,a),i=s}return i*=.5,{wishdir:i===0?o:Ce(o),wishspeed:i}}function Wt(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Ht(e){return e>89&&e<180?89:e<271&&e>=180?271:e}function Ve(e){let{pmFlags:t,cmdAngles:n,deltaAngles:r}=e,s;(t&32)!==0?s={x:0,y:n.y+r.y,z:0}:(s=Wt(n,r),s={...s,x:Ht(s.x)});let o=Fe(s);return{viewangles:s,...o}}var Kt={pmFriction:6,pmStopSpeed:100,pmAccelerate:10,pmAirAccelerate:1,pmWaterAccelerate:4,pmWaterFriction:1,pmMaxSpeed:300,pmDuckSpeed:100,pmWaterSpeed:400,groundIsSlick:!1},Xt=800,L={x:0,y:0,z:0},Yt=250;function k(){return{origin:L,velocity:L,viewangles:L,pmFlags:_.OnGround,pmType:Ge.Normal,waterlevel:B.None,gravity:Xt,deltaAngles:L}}function be(e){return e?{...k(),...e,origin:{...e.origin},velocity:{...e.velocity},viewangles:{...e.viewangles},deltaAngles:e.deltaAngles?{...e.deltaAngles}:L}:k()}function N(e,t,n){return e+(t-e)*n}function le(e,t,n){let r=Me(t-e);return r>180&&(r-=360),Me(e+r*n)}function $t(e,t,n){let r=Math.max(0,Math.min(n,1));return{origin:{x:N(e.origin.x,t.origin.x,r),y:N(e.origin.y,t.origin.y,r),z:N(e.origin.z,t.origin.z,r)},velocity:{x:N(e.velocity.x,t.velocity.x,r),y:N(e.velocity.y,t.velocity.y,r),z:N(e.velocity.z,t.velocity.z,r)},viewangles:{x:le(e.viewangles.x,t.viewangles.x,r),y:le(e.viewangles.y,t.viewangles.y,r),z:le(e.viewangles.z,t.viewangles.z,r)},pmFlags:t.pmFlags,pmType:t.pmType,waterlevel:t.waterlevel,gravity:t.gravity,deltaAngles:t.deltaAngles}}function jt(e,t,n){let r=Math.min(Math.max(t.msec,0),Yt)/1e3,s=M(e.pmFlags,_.OnGround),o=M(e.pmFlags,_.OnLadder),i=It({velocity:e.velocity,frametime:r,onGround:s,groundIsSlick:n.groundIsSlick,onLadder:o,waterlevel:e.waterlevel,pmFriction:n.pmFriction,pmStopSpeed:n.pmStopSpeed,pmWaterFriction:n.pmWaterFriction}),{viewangles:a,forward:u,right:l}=Ve({pmFlags:e.pmFlags,cmdAngles:t.angles,deltaAngles:e.deltaAngles??L}),c=e.waterlevel>B.None?Vt({forward:u,right:l,cmd:t,maxSpeed:n.pmWaterSpeed}):Gt({forward:u,right:l,cmd:t,maxSpeed:n.pmMaxSpeed});if(e.waterlevel>B.None)i=Oe({velocity:i,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmWaterAccelerate,frametime:r});else if(s||o){let z=M(e.pmFlags,_.Ducked)?n.pmDuckSpeed:n.pmMaxSpeed,C=c.wishspeed>z?{wishdir:c.wishdir,wishspeed:z}:c;i=Oe({velocity:i,wishdir:C.wishdir,wishspeed:C.wishspeed,accel:n.pmAccelerate,frametime:r})}else i=Bt({velocity:i,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmAirAccelerate,frametime:r}),i={...i,z:i.z-e.gravity*r};let m=D(i,r),p=I(e.origin,m);return{...e,origin:p,velocity:i,viewangles:a}}var qt=class{constructor(e={}){this.baseFrame={frame:0,timeMs:0,state:k()},this.commands=[],this.predicted=k(),this.settings={...Kt,...e},this.predicted=this.baseFrame.state??k()}setAuthoritative(e){let t=be(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=be(this.baseFrame.state);for(let t of this.commands)e=jt(e,t,this.settings);return this.predicted=e,e}},Jt={runPitch:.002,runRoll:.005,bobUp:.005,bobPitch:.002,bobRoll:.002,maxBobHeight:6,maxBobAngle:1.2};function Zt(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 Qt(e,t,n){return t?e>210?n/400:e>100?n/800:n/1600:0}function en(e,t,n,r,s){if(t<5)return{bobTime:0,bobCycle:0,bobCycleRun:0,bobFracSin:0};let o=Qt(t,r,s),i=e+o,u=M(n,_.Ducked)&&r?i*4:i;return{bobTime:i,bobCycle:Math.floor(u),bobCycleRun:Math.floor(i),bobFracSin:Math.abs(Math.sin(u*Math.PI))}}var tn=class{constructor(e={}){this.bobTime=0,this.bobCycle=0,this.bobCycleRun=0,this.bobFracSin=0,this.settings={...Jt,...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(Ve({pmFlags:e.pmFlags,cmdAngles:e.viewangles,deltaAngles:e.deltaAngles??xt}).viewangles),s=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),o=M(e.pmFlags,_.OnGround),i=en(this.bobTime,s,e.pmFlags,o,t);this.bobTime=i.bobTime,this.bobCycle=i.bobCycle,this.bobCycleRun=i.bobCycleRun,this.bobFracSin=i.bobFracSin;let a=P(e.velocity,n)*this.settings.runPitch,u=P(e.velocity,r)*this.settings.runRoll,l=this.bobFracSin*this.settings.bobPitch*s,c=this.bobFracSin*this.settings.bobRoll*s;M(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*s*this.settings.bobUp,this.settings.maxBobHeight),p=0,z=0;if(this.kick&&this.kick.remainingMs>0){let Le=Math.max(0,Math.min(1,this.kick.remainingMs/this.kick.durationMs));p+=Le*this.kick.pitch,z+=Le*this.kick.roll,this.kick.remainingMs=Math.max(0,this.kick.remainingMs-t),this.kick.remainingMs===0&&(this.kick=void 0)}let Re={angles:{x:a+p,y:0,z:u+z},offset:Zt({x:0,y:0,z:m}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:s};return this.lastSample=Re,Re}};function nn(e){return e.trim().toLowerCase()}var We=(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))(We||{}),gs={"+attack":R.Attack,"+use":R.Use,"+holster":R.Holster,"+jump":R.Jump,"+crouch":R.Crouch},xs=new Map(Object.values(We).map(e=>[nn(e),e]));function He(e){let t=new qt,n=new tn,r,s,o;return{init(i){r=i,i?.state&&t.setAuthoritative(i),e.engine.trace({x:0,y:0,z:0},{x:1,y:0,z:0})},predict(i){return t.enqueueCommand(i)},render(i){i.latest?.state&&(t.setAuthoritative(i.latest),r=i.latest),i.previous?.state&&i.latest?.state?s=$t(i.previous.state,i.latest.state,i.alpha):s=i.latest?.state??i.previous?.state??t.getPredictedState();let a=i.latest&&i.previous?Math.max(0,i.latest.timeMs-i.previous.timeMs):0;o=n.sample(s,a)},shutdown(){r=void 0,s=void 0},get prediction(){return t},get lastRendered(){return s},get view(){return n},get lastView(){return o}}}var Ke=25,rn=5,sn=()=>typeof performance<"u"?performance.now():Date.now(),on=e=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>e()):setTimeout(e,Ke)},Xe=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(),o=this.lastTimeMs===void 0?0:s-this.lastTimeMs;this.lastTimeMs=s,this.advance(o,s),this.running&&this.options.schedule(this.tick)};let n=t.fixedDeltaMs??Ke,r=t.maxSubSteps??rn;this.options={fixedDeltaMs:n,maxSubSteps:r,maxDeltaMs:t.maxDeltaMs??n*r,startTimeMs:t.startTimeMs,now:t.now??sn,schedule:t.schedule??on}}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 s=this.options.fixedDeltaMs===0?0:this.accumulatorMs/this.options.fixedDeltaMs;this.callbacks.render?.({alpha:s,nowMs:t,accumulatorMs:this.accumulatorMs,frame:this.frame})}},an=class{constructor(e,t,n={}){this.game=e,this.client=t,this.started=!1,this.stepSimulation=s=>{this.previousFrame=this.latestFrame,this.latestFrame=this.game.frame(s)},this.renderClient=s=>{this.client&&this.client.render({...s,previous:this.previousFrame,latest:this.latestFrame})};let r=n.loop?.now?.()??Date.now();this.startTimeMs=n.startTimeMs??n.loop?.startTimeMs??r,this.loop=new Xe({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 ws=Math.PI/180;var As=Math.PI/180,Ts=180/Math.PI;var v=1,w=2;var ye=8,ve=16,cn=32;var un=16384;var K=65536,Ye=1<<17,ln=1<<18,hn=1<<19,dn=1<<20,fn=1<<21,mn=1<<22,pn=1<<23,zs=1<<24,X=1<<25,yn=1<<26,Ns=1<<27,Rs=1<<28,Ls=1<<29,Y=1<<30,Ms=1<<31;var Os=1<<25,bs=1<<28,Cs=1<<29,ks=1<<30,Ps=1<<31,Ds=v|w,Fs=v|K|w|X|Y,Us=v|K|w,Is=v|Ye|w|X|Y,Bs=cn|ye|ve,Gs=v|ve|ye,vn=v|X|Y|w|yn,Vs=ln|hn|dn|fn|mn|pn,Ws=v|ye|ve|X|Y,Hs=v|K|w,Ks=v|w,Xs=v|K|w|Ye,Ys=vn|un,$s=Number.MAX_SAFE_INTEGER-1;var $e=256,gn=256,xn=8192,Sn=2048,_n=512,En=256,wn=$e*2,An=256,fe=32;var je=(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+Sn]="Images",e[e.Lights=e.Images+_n]="Lights",e[e.ShadowLights=e.Lights+gn]="ShadowLights",e[e.Items=e.ShadowLights+An]="Items",e[e.PlayerSkins=e.Items+En]="PlayerSkins",e[e.General=e.PlayerSkins+$e]="General",e[e.WheelWeapons=e.General+wn]="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))(je||{}),js=je.MaxConfigStrings;var Tn=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 qe(e,t,n,r){return new Tn(e,new an(t,n,r))}function zn(){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 qs=zn();var Js=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 pe=4,me=7*pe,Zs=[{index:0,size:3,type:5126,stride:me,offset:0},{index:1,size:2,type:5126,stride:me,offset:3*pe},{index:2,size:2,type:5126,stride:me,offset:5*pe}];var Qs=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 Je(e){return{init(){e.trace({x:0,y:0,z:0},{x:0,y:0,z:0})},shutdown(){},createMainLoop(t,n){return new Xe(t,n)}}}var Nn={x:0,y:0,z:0},si=Math.PI/180;var ii=Math.PI/180,oi=180/Math.PI;var g=624,Rn=397,Ln=2567483615,Mn=2147483648,On=2147483647,ge=4294967296,bn=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]&Mn|this.state[(e+1)%g]&On,n=this.state[(e+Rn)%g]^t>>>1;(t&1)!==0&&(n^=Ln),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)}},tt=class{constructor(e={}){this.mt=new bn(e.seed)}frandom(){return this.mt.nextUint32()/ge}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=ge-ge%n,s;do s=this.mt.nextUint32();while(s>=r);return e+s%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 tt(e)}var x=1,A=2;var _e=8,Ee=16,kn=32;var Pn=16384;var Q=65536,nt=1<<17,Dn=1<<18,Fn=1<<19,Un=1<<20,In=1<<21,Bn=1<<22,Gn=1<<23,ai=1<<24,ee=1<<25,Vn=1<<26,ci=1<<27,ui=1<<28,li=1<<29,te=1<<30,hi=1<<31;var di=1<<25,fi=1<<28,mi=1<<29,pi=1<<30,yi=1<<31,vi=x|A,gi=x|Q|A|ee|te,xi=x|Q|A,Si=x|nt|A|ee|te,_i=kn|_e|Ee,Ei=x|Ee|_e,Wn=x|ee|te|A|Vn,wi=Dn|Fn|Un|In|Bn|Gn,Ai=x|_e|Ee|ee|te,Ti=x|Q|A,zi=x|A,Ni=x|Q|A|nt,Ri=Wn|Pn,Li=Number.MAX_SAFE_INTEGER-1;var rt=256,Hn=256,Kn=8192,Xn=2048,Yn=512,$n=256,jn=rt*2,qn=256,xe=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+Kn]="Sounds",e[e.Images=e.Sounds+Xn]="Images",e[e.Lights=e.Images+Yn]="Lights",e[e.ShadowLights=e.Lights+Hn]="ShadowLights",e[e.Items=e.ShadowLights+qn]="Items",e[e.PlayerSkins=e.Items+$n]="PlayerSkins",e[e.General=e.PlayerSkins+rt]="General",e[e.WheelWeapons=e.General+jn]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+xe]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+xe]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+xe]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(st||{}),Mi=st.MaxConfigStrings;var Jn={...Nn};function h(){return{...Jn}}var Ze=Object.freeze({aiflags: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={...Ze},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={...Ze}}},we=[{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,s)=>{if(r<0||r>=this.entities.length)throw new Error(`Invalid entity index ${r} in ${s}`);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 s=this.entities[e.activeOrder[r]];s.inUse=!0,this.link(s)}for(let r of e.pendingFree){let s=this.entities[r];s.inUse=!1,s.freePending=!0,s.linkNext=null,s.linkPrevious=null,this.pendingFree.push(r)}for(let r of e.freeList){let s=this.entities[r];s.inUse=!1,s.freePending=!1,s.linkNext=null,s.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 Qe(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 it=we.filter(e=>e.save),nr=new Map(it.map(e=>[e.name,e]));function rr(e){return[e.x,e.y,e.z]}function sr(e){let t=e;if(!Array.isArray(t)||t.length!==3)throw new Error("Invalid vec3 serialization");let[n,r,s]=t;return{x:n,y:r,z:s}}function F(e,t,n){e[t]=n}function ir(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){this.targetNameIndex=new Map,this.random=Cn(),this.currentTimeSeconds=0,this.pool=new er(e),this.thinkScheduler=new tr}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)}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||Qe(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 it){let s=t[r.name];switch(r.type){case"vec3":n[r.name]=rr(s);break;case"entity":n[r.name]=s?.index??null;break;case"inventory":n[r.name]=ir(s);break;default:n[r.name]=s??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){this.currentTimeSeconds=e.timeSeconds,this.pool.restore(e.pool);let t=new Map;for(let r of this.pool)t.set(r.index,r);let n=[];for(let r of e.entities){let s=t.get(r.index);if(s)for(let[o,i]of Object.entries(r.fields)){let a=nr.get(o);if(!(!a||i===void 0))switch(a.type){case"vec3":F(s,o,sr(i));break;case"entity":n.push({entity:s,name:a.name,targetIndex:i});break;case"inventory":F(s,o,or(i));break;case"boolean":F(s,o,!!i);break;default:F(s,o,i);break}}}for(let r of n){let s=r.targetIndex===null?null:t.get(r.targetIndex)??null;F(r.entity,r.name,s)}this.thinkScheduler.restore(e.thinks,r=>t.get(r))}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],s=null;for(let o=n+1;o<t.length;o+=1){let i=t[o];if(!r.touch&&!i.touch)continue;s||(s=$(r));let a=$(i);Qe(s,a)&&(r.touch&&r.touch(r,i),i.touch&&i.touch(i,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 Oi=1/40;var bi=new Map(we.map(e=>[e.name,e]));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 s=n[r];s&&s(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 s=t[r];s&&(t[n]=s,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 Ci=1<<24;var Se=1,dr=1;function f(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 fr(e){if(e===void 0)return{frameNumber:0,timeSeconds:0,previousTimeSeconds:0,deltaSeconds:0};let t=f(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 mr(e){if(e===void 0)return new tt().getState();let t=f(e,"rng"),n=f(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=f(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=f(e,"entity.fields"),n={};for(let[r,s]of Object.entries(t)){if(s===null){n[r]=null;continue}switch(typeof s){case"number":case"string":case"boolean":n[r]=s;break;default:{if(!Array.isArray(s)){let o=f(s,r),i={};for(let[a,u]of Object.entries(o))i[a]=d(u,`${r}.${a}`);n[r]=i;break}if(Array.isArray(s)&&s.length===3){let[o,i,a]=s;n[r]=[d(o,`${r}[0]`),d(i,`${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=f(t,`entities[${n}]`);return{index:d(r.index,`entities[${n}].index`),fields:yr(r.fields)}})}function gr(e){let t=f(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=f(e,"entities");return{timeSeconds:d(t.timeSeconds,"entities.timeSeconds"),pool:gr(t.pool),entities:vr(t.entities),thinks:pr(t.thinks)}}function Sr(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=f(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 _r(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 Er(e){return e===void 0?{}:f(e,"gameState")}function ot(e,t={}){let{allowNewerVersion:n=!0}=t,r=typeof e=="string"?JSON.parse(e):e,s=f(r,"save"),o=s.version??Se,i=d(o,"version");if(i<dr)throw new Error(`Unsupported save version ${i}`);if(i>Se&&!n)throw new Error(`Save version ${i} is newer than supported ${Se}`);return{version:i,timestamp:d(s.timestamp,"timestamp"),map:Z(s.map,"map"),difficulty:d(s.difficulty,"difficulty"),playtimeSeconds:d(s.playtimeSeconds,"playtimeSeconds"),gameState:Er(s.gameState),level:fr(s.level),rng:mr(s.rng),entities:xr(s.entities),cvars:Sr(s.cvars),configstrings:_r(s.configstrings)}}var ki=new Set(we.filter(e=>e.save).map(e=>e.name));var et=globalThis.TextEncoder;function b(e){return ot({...e},{allowNewerVersion:!0})}function wr(e){return et?new et().encode(JSON.stringify(e)).length:JSON.stringify(e).length}var Ar=class{constructor(){this.records=new Map}async init(){return Promise.resolve()}async put(e){let t={id:e.id,metadata:{...e.metadata},save:b(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:b(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:b(e.save)}))}},Tr=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,s)=>{let i=n.transaction(this.storeName,e).objectStore(this.storeName),a=t(i);a.onsuccess=()=>r(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",n=>n.get(e));return t?{id:t.id,metadata:{...t.metadata},save:b(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:b(t.save)}))}},Ae=class U{constructor(t={}){let{dbName:n=U.DEFAULT_DB_NAME,storeName:r=U.DEFAULT_STORE}=t,s=t.indexedDB??globalThis.indexedDB;s?this.adapter=new Tr(s,n,r):this.adapter=new Ar}async save(t,n,r={}){let s=b(n),o={id:t,name:r.name??t,map:s.map,difficulty:s.difficulty,playtimeSeconds:s.playtimeSeconds,timestamp:s.timestamp,version:s.version,bytes:wr(s)};return await this.adapter.init(),await this.adapter.put({id:t,metadata:o,save:s}),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 ot(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(U.QUICK_SLOT,t,{name:"Quick Save"})}async quickLoad(t={}){return this.load(U.QUICK_SLOT,t)}};Ae.DEFAULT_DB_NAME="quake2ts-saves";Ae.DEFAULT_STORE="saves";Ae.QUICK_SLOT="quicksave";var at=(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))(at||{}),Pi=Object.keys(at).length/2;var q={x:0,y:0,z:0};function ct(e,t){let n=t.gravity,r=new hr,s=new ur,o=new ar;s.addStage("prep",c=>{r.tick(c),o.beginFrame(r.current.timeSeconds)}),s.addStage("simulate",({deltaSeconds:c})=>{a={x:a.x+n.x*c,y:a.y+n.y*c,z:a.z+n.z*c},i={x:i.x+a.x*c,y:i.y+a.y*c,z:i.z+a.z*c},o.runFrame()});let i={...q},a={...q},u=c=>({frame:c,timeMs:s.time,state:{gravity:{...n},origin:{...i},velocity:{...a},level:{...r.current},entities:{activeCount:o.activeCount,worldClassname:o.world.classname}}}),l=c=>{s.reset(c),r.start(c),i={...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=s.advance(c);return u(m.frame)},entities:o}}var ne={x:0,y:0,z:0};var Yi=Math.PI/180;var $i=Math.PI/180,ji=180/Math.PI;var S=1,T=2;var ze=8,Ne=16,zr=32;var Nr=16384;var re=65536,ut=1<<17,Rr=1<<18,Lr=1<<19,Mr=1<<20,Or=1<<21,br=1<<22,Cr=1<<23,qi=1<<24,se=1<<25,kr=1<<26,Ji=1<<27,Zi=1<<28,Qi=1<<29,ie=1<<30,eo=1<<31;var to=1<<25,no=1<<28,ro=1<<29,so=1<<30,io=1<<31;var oo=S|T,ao=S|re|T|se|ie,co=S|re|T,uo=S|ut|T|se|ie,lo=zr|ze|Ne,ho=S|Ne|ze,Pr=S|se|ie|T|kr,fo=Rr|Lr|Mr|Or|br|Cr,mo=S|ze|Ne|se|ie,po=S|re|T,yo=S|T,vo=S|re|T|ut,go=Pr|Nr;var xo=Number.MAX_SAFE_INTEGER-1;var lt=256;var Dr=256,Fr=8192,Ur=2048,Ir=512,Br=256,Gr=lt*2,Vr=256,Te=32;var 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+Fr]="Sounds",e[e.Images=e.Sounds+Ur]="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+lt]="General",e[e.WheelWeapons=e.General+Gr]="WheelWeapons",e[e.WheelAmmo=e.WheelWeapons+Te]="WheelAmmo",e[e.WheelPowerups=e.WheelAmmo+Te]="WheelPowerups",e[e.CdLoopCount=e.WheelPowerups+Te]="CdLoopCount",e[e.GameStyle=e.CdLoopCount+1]="GameStyle",e[e.MaxConfigStrings=e.GameStyle+1]="MaxConfigStrings",e))(ht||{}),So=ht.MaxConfigStrings;function Wr(){let e=Je({trace(s,o){return{start:s,end:o,fraction:1}}}),t=ct({trace(s,o){return{start:s,end:o,fraction:1}}},{gravity:ne}),n=He({engine:{trace:()=>({start:ne,end:ne,fraction:1})}}),r=qe(e,t,n);return r.start(),{engine:e,game:t,client:n,runtime:r}}return gt(Hr);})();
2
2
  //# sourceMappingURL=index.global.js.map