quake2ts 0.0.49 → 0.0.50
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/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 +33 -15
- package/apps/viewer/dist/cjs/index.cjs.map +1 -1
- package/apps/viewer/dist/esm/index.js +33 -15
- package/apps/viewer/dist/esm/index.js.map +1 -1
- package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- 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 +458 -390
- package/packages/game/dist/cjs/index.cjs.map +1 -1
- package/packages/game/dist/esm/index.js +454 -390
- package/packages/game/dist/esm/index.js.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/game/dist/types/entities/callbacks.d.ts +6 -0
- package/packages/game/dist/types/entities/callbacks.d.ts.map +1 -0
- package/packages/game/dist/types/entities/index.d.ts +1 -0
- package/packages/game/dist/types/entities/index.d.ts.map +1 -1
- package/packages/game/dist/types/entities/system.d.ts +5 -3
- package/packages/game/dist/types/entities/system.d.ts.map +1 -1
- package/packages/game/dist/types/inventory/playerInventory.d.ts +10 -0
- package/packages/game/dist/types/inventory/playerInventory.d.ts.map +1 -1
- package/packages/game/dist/types/save/save.d.ts +7 -2
- package/packages/game/dist/types/save/save.d.ts.map +1 -1
- package/packages/game/dist/types/save/tests/callbacks.test.d.ts +2 -0
- package/packages/game/dist/types/save/tests/callbacks.test.d.ts.map +1 -0
- package/packages/game/dist/types/save/tests/playerInventory.test.d.ts +2 -0
- package/packages/game/dist/types/save/tests/playerInventory.test.d.ts.map +1 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Quake2=(()=>{var oe=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var yt=Object.prototype.hasOwnProperty;var vt=(e,t)=>{for(var n in t)oe(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&&oe(e,i,{get:()=>t[i],enumerable:!(r=mt(t,i))||r.enumerable});return e};var xt=e=>gt(oe({},"__esModule",{value:!0}),e);var Hr={};vt(Hr,{bootstrapViewer:()=>Wr});var _t={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,Et=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*Et}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)),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},p={x:l*s*o-u*-i,y:l*s*i-u*o,z:l*a};return{forward:c,right:m,up:p}}var y=1,E=2;var he=8,de=16,wt=32;var Tt=16384;var V=65536,Ue=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|Ue|E|W|H,ci=wt|he|de,ui=y|de|he,Ot=y|W|H|E|bt,li=At|zt|Nt|Rt|Lt|Mt,hi=y|he|de|W|H,di=y|V|E,fi=y|E,mi=y|V|E|Ue,pi=Ot|Tt,yi=Number.MAX_SAFE_INTEGER-1,Ie=256,Ct=256,kt=8192,Pt=2048,Dt=512,Ft=256,Ut=Ie*2,It=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+Pt]="Images",e[e.Lights=e.Images+Dt]="Lights",e[e.ShadowLights=e.Lights+Ct]="ShadowLights",e[e.Items=e.ShadowLights+It]="Items",e[e.PlayerSkins=e.Items+Ft]="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||{}),vi=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||{}),S=(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))(S||{});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 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 C=c<u?u:c;m+=C*a*n}s>0&&!o&&(m+=c*l*s*n);let p=c-m;if(p<0&&(p=0),p===c)return t;let z=p/c;return D(t,z)}function be(e){let{velocity:t,wishdir:n,wishspeed:r,accel:i,frametime:o}=e,s=P(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=P(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=D(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=D(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 Ve(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,L={x:0,y:0,z:0},$t=250;function k(){return{origin:L,velocity:L,viewangles:L,pmFlags:S.OnGround,pmType:Ge.Normal,waterlevel:B.None,gravity:Yt,deltaAngles:L}}function Oe(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 jt(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 qt(e,t,n){let r=Math.min(Math.max(t.msec,0),$t)/1e3,i=M(e.pmFlags,S.OnGround),o=M(e.pmFlags,S.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}=Ve({pmFlags:e.pmFlags,cmdAngles:t.angles,deltaAngles:e.deltaAngles??L}),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=be({velocity:s,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmWaterAccelerate,frametime:r});else if(i||o){let z=M(e.pmFlags,S.Ducked)?n.pmDuckSpeed:n.pmMaxSpeed,C=c.wishspeed>z?{wishdir:c.wishdir,wishspeed:z}:c;s=be({velocity:s,wishdir:C.wishdir,wishspeed:C.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=D(s,r),p=I(e.origin,m);return{...e,origin:p,velocity:s,viewangles:a}}var Jt=class{constructor(e={}){this.baseFrame={frame:0,timeMs:0,state:k()},this.commands=[],this.predicted=k(),this.settings={...Xt,...e},this.predicted=this.baseFrame.state??k()}setAuthoritative(e){let t=Oe(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=Oe(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=M(n,S.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(Ve({pmFlags:e.pmFlags,cmdAngles:e.viewangles,deltaAngles:e.deltaAngles??_t}).viewangles),i=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),o=M(e.pmFlags,S.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=P(e.velocity,n)*this.settings.runPitch,u=P(e.velocity,r)*this.settings.runRoll,l=this.bobFracSin*this.settings.bobPitch*i,c=this.bobFracSin*this.settings.bobRoll*i;M(e.pmFlags,S.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),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:Qt({x:0,y:0,z:m}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:i};return this.lastSample=Re,Re}};function rn(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||{}),gi={"+attack":R.Attack,"+use":R.Use,"+holster":R.Holster,"+jump":R.Jump,"+crouch":R.Crouch},xi=new Map(Object.values(We).map(e=>[rn(e),e]));function He(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 Ke=25,sn=5,on=()=>typeof performance<"u"?performance.now():Date.now(),an=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 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??Ke,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 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 wi=Math.PI/180;var Ti=Math.PI/180,Ai=180/Math.PI;var v=1,w=2;var ye=8,ve=16,un=32;var ln=16384;var K=65536,Ye=1<<17,hn=1<<18,dn=1<<19,fn=1<<20,mn=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,Ci=1<<29,ki=1<<30,Pi=1<<31,Di=v|w,Fi=v|K|w|X|Y,Ui=v|K|w,Ii=v|Ye|w|X|Y,Bi=un|ye|ve,Gi=v|ve|ye,gn=v|X|Y|w|vn,Vi=hn|dn|fn|mn|pn|yn,Wi=v|ye|ve|X|Y,Hi=v|K|w,Ki=v|w,Xi=v|K|w|Ye,Yi=gn|ln,$i=Number.MAX_SAFE_INTEGER-1;var $e=256,xn=256,_n=8192,Sn=2048,En=512,wn=256,Tn=$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+_n]="Sounds",e[e.Images=e.Sounds+Sn]="Images",e[e.Lights=e.Images+En]="Lights",e[e.ShadowLights=e.Lights+xn]="ShadowLights",e[e.Items=e.ShadowLights+An]="Items",e[e.PlayerSkins=e.Items+wn]="PlayerSkins",e[e.General=e.PlayerSkins+$e]="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))(je||{}),ji=je.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 qe(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 pe=4,me=7*pe,Zi=[{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 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 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 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,ge=4294967296,Cn=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)}},tt=class{constructor(e={}){this.mt=new Cn(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,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 kn(e){return new tt(e)}var x=1,T=2;var Se=8,Ee=16,Pn=32;var Dn=16384;var Q=65536,nt=1<<17,Fn=1<<18,Un=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,fs=1<<28,ms=1<<29,ps=1<<30,ys=1<<31,vs=x|T,gs=x|Q|T|ee|te,xs=x|Q|T,_s=x|nt|T|ee|te,Ss=Pn|Se|Ee,Es=x|Ee|Se,Hn=x|ee|te|T|Wn,ws=Fn|Un|In|Bn|Gn|Vn,Ts=x|Se|Ee|ee|te,As=x|Q|T,zs=x|T,Ns=x|Q|T|nt,Rs=Hn|Dn,Ls=Number.MAX_SAFE_INTEGER-1;var rt=256,Kn=256,Xn=8192,Yn=2048,$n=512,jn=256,qn=rt*2,Jn=256,xe=32,it=(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+rt]="General",e[e.WheelWeapons=e.General+qn]="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))(it||{}),Ms=it.MaxConfigStrings;var st={...Rn};function h(){return{...st}}var Ze=Object.freeze({aiflags:0,last_sighting:st,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={...Ze,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={...Ze,last_sighting:h()},this.combattarget=void 0,this.show_hostile=0,this.light_level=0}},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,b=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!==b&&this.freeList.push(n);let t=this.entities[b];t.inUse=!0,t.classname="worldspawn",this.activeHead=t}get world(){return this.entities[b]}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===b)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===b)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(b))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 ot=we.filter(e=>e.save),nr=new Map(ot.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 F(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){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=$(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 ot){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;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){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 i=t.get(r.index);if(i)for(let[o,s]of Object.entries(r.fields)){let a=nr.get(o);if(!(!a||s===void 0))switch(a.type){case"vec3":F(i,o,ir(s));break;case"entity":n.push({entity:i,name:a.name,targetIndex:s});break;case"inventory":F(i,o,or(s));break;case"boolean":F(i,o,!!s);break;default:F(i,o,s);break}}}for(let r of n){let i=r.targetIndex===null?null:t.get(r.targetIndex)??null;F(r.entity,r.name,i)}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],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);Qe(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(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 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 _e=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,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=f(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=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 _r(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 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 Er(e){return e===void 0?{}:f(e,"gameState")}function at(e,t={}){let{allowNewerVersion:n=!0}=t,r=typeof e=="string"?JSON.parse(e):e,i=f(r,"save"),o=i.version??_e,s=d(o,"version");if(s<dr)throw new Error(`Unsupported save version ${s}`);if(s>_e&&!n)throw new Error(`Save version ${s} is newer than supported ${_e}`);return{version:s,timestamp:d(i.timestamp,"timestamp"),map:Z(i.map,"map"),difficulty:d(i.difficulty,"difficulty"),playtimeSeconds:d(i.playtimeSeconds,"playtimeSeconds"),gameState:Er(i.gameState),level:fr(i.level),rng:mr(i.rng),entities:xr(i.entities),cvars:_r(i.cvars),configstrings:Sr(i.configstrings)}}var ks=new Set(we.filter(e=>e.save).map(e=>e.name));var et=globalThis.TextEncoder;function O(e){return at({...e},{allowNewerVersion:!0})}function wr(e){return et?new et().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:O(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:O(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:O(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:O(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:O(t.save)}))}},Te=class U{constructor(t={}){let{dbName:n=U.DEFAULT_DB_NAME,storeName:r=U.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=O(n),o={id:t,name:r.name??t,map:i.map,difficulty:i.difficulty,playtimeSeconds:i.playtimeSeconds,timestamp:i.timestamp,version:i.version,bytes:wr(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 at(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)}};Te.DEFAULT_DB_NAME="quake2ts-saves";Te.DEFAULT_STORE="saves";Te.QUICK_SLOT="quicksave";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||{}),Ps=Object.keys(ct).length/2;var q={x:0,y:0,z:0};function ut(e,t){let n=t.gravity,r=new hr,i=new ur,o=new ar;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}}var ne={x:0,y:0,z:0};var Ys=Math.PI/180;var $s=Math.PI/180,js=180/Math.PI;var _=1,A=2;var ze=8,Ne=16,zr=32;var Nr=16384;var re=65536,lt=1<<17,Rr=1<<18,Lr=1<<19,Mr=1<<20,br=1<<21,Or=1<<22,Cr=1<<23,qs=1<<24,ie=1<<25,kr=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=_|A,ao=_|re|A|ie|se,co=_|re|A,uo=_|lt|A|ie|se,lo=zr|ze|Ne,ho=_|Ne|ze,Pr=_|ie|se|A|kr,fo=Rr|Lr|Mr|br|Or|Cr,mo=_|ze|Ne|ie|se,po=_|re|A,yo=_|A,vo=_|re|A|lt,go=Pr|Nr;var xo=Number.MAX_SAFE_INTEGER-1;var ht=256;var Dr=256,Fr=8192,Ur=2048,Ir=512,Br=256,Gr=ht*2,Vr=256,Ae=32;var 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+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+ht]="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))(dt||{}),_o=dt.MaxConfigStrings;function Wr(){let e=Je({trace(i,o){return{start:i,end:o,fraction:1}}}),t=ut({trace(i,o){return{start:i,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 xt(Hr);})();
|
|
1
|
+
"use strict";var Quake2=(()=>{var oe=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var yt=Object.prototype.hasOwnProperty;var vt=(e,t)=>{for(var n in t)oe(e,n,{get:t[n],enumerable:!0})},gt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of pt(t))!yt.call(e,s)&&s!==n&&oe(e,s,{get:()=>t[s],enumerable:!(r=mt(t,s))||r.enumerable});return e};var xt=e=>gt(oe({},"__esModule",{value:!0}),e);var Hr={};vt(Hr,{bootstrapViewer:()=>Vr});var St={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 F(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 _t(e){return D(e,e)}function G(e){return Math.sqrt(_t(e))}function Ce(e){let t=G(e);return t===0?e:F(e,1/t)}var ke=0,Pe=1,De=2,wt=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*wt}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,w=2;var he=8,de=16,Et=32;var Tt=16384;var W=65536,Ue=1<<17,At=1<<18,zt=1<<19,Nt=1<<20,Rt=1<<21,Lt=1<<22,Mt=1<<23,$r=1<<24,V=1<<25,bt=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|w,is=y|W|w|V|H,os=y|W|w,as=y|Ue|w|V|H,cs=Et|he|de,us=y|de|he,Ot=y|V|H|w|bt,ls=At|zt|Nt|Rt|Lt|Mt,hs=y|he|de|V|H,ds=y|W|w,fs=y|w,ms=y|W|w|Ue,ps=Ot|Tt,ys=Number.MAX_SAFE_INTEGER-1,Ie=256,Ct=256,kt=8192,Pt=2048,Dt=512,Ft=256,Ut=Ie*2,It=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+Pt]="Images",e[e.Lights=e.Images+Dt]="Lights",e[e.ShadowLights=e.Lights+Ct]="ShadowLights",e[e.Items=e.ShadowLights+It]="Items",e[e.PlayerSkins=e.Items+Ft]="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.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 Bt(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 F(t,z)}function be(e){let{velocity:t,wishdir:n,wishspeed:r,accel:s,frametime:o}=e,i=D(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 Gt(e){let{velocity:t,wishdir:n,wishspeed:r,accel:s,frametime:o}=e,i=Math.min(r,30),a=D(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 Wt(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=F(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=F(o,a),i=s}return i*=.5,{wishdir:i===0?o:Ce(o),wishspeed:i}}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,s;(t&32)!==0?s={x:0,y:n.y+r.y,z:0}:(s=Ht(n,r),s={...s,x:Kt(s.x)});let o=Fe(s);return{viewangles:s,...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,L={x:0,y:0,z:0},$t=250;function P(){return{origin:L,velocity:L,viewangles:L,pmFlags:_.OnGround,pmType:Ge.Normal,waterlevel:B.None,gravity:Yt,deltaAngles:L}}function Oe(e){return e?{...P(),...e,origin:{...e.origin},velocity:{...e.velocity},viewangles:{...e.viewangles},deltaAngles:e.deltaAngles?{...e.deltaAngles}:L}:P()}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 jt(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 qt(e,t,n){let r=Math.min(Math.max(t.msec,0),$t)/1e3,s=M(e.pmFlags,_.OnGround),o=M(e.pmFlags,_.OnLadder),i=Bt({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}=We({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}):Wt({forward:u,right:l,cmd:t,maxSpeed:n.pmMaxSpeed});if(e.waterlevel>B.None)i=be({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,k=c.wishspeed>z?{wishdir:c.wishdir,wishspeed:z}:c;i=be({velocity:i,wishdir:k.wishdir,wishspeed:k.wishspeed,accel:n.pmAccelerate,frametime:r})}else i=Gt({velocity:i,wishdir:c.wishdir,wishspeed:c.wishspeed,accel:n.pmAirAccelerate,frametime:r}),i={...i,z:i.z-e.gravity*r};let m=F(i,r),p=I(e.origin,m);return{...e,origin:p,velocity:i,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=Oe(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=Oe(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,s){if(t<5)return{bobTime:0,bobCycle:0,bobCycleRun:0,bobFracSin:0};let o=en(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 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??St}).viewangles),s=Math.sqrt(e.velocity.x*e.velocity.x+e.velocity.y*e.velocity.y),o=M(e.pmFlags,_.OnGround),i=tn(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=D(e.velocity,n)*this.settings.runPitch,u=D(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:Qt({x:0,y:0,z:m}),bobCycle:this.bobCycle,bobCycleRun:this.bobCycleRun,bobFracSin:this.bobFracSin,xyspeed:s};return this.lastSample=Re,Re}};function rn(e){return e.trim().toLowerCase()}var Ve=(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))(Ve||{}),gs={"+attack":R.Attack,"+use":R.Use,"+holster":R.Holster,"+jump":R.Jump,"+crouch":R.Crouch},xs=new Map(Object.values(Ve).map(e=>[rn(e),e]));function He(e){let t=new Jt,n=new nn,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=jt(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,sn=5,on=()=>typeof performance<"u"?performance.now():Date.now(),an=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??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 s=this.options.fixedDeltaMs===0?0:this.accumulatorMs/this.options.fixedDeltaMs;this.callbacks.render?.({alpha:s,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=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 Es=Math.PI/180;var Ts=Math.PI/180,As=180/Math.PI;var v=1,E=2;var ye=8,ve=16,un=32;var ln=16384;var K=65536,Ye=1<<17,hn=1<<18,dn=1<<19,fn=1<<20,mn=1<<21,pn=1<<22,yn=1<<23,zs=1<<24,X=1<<25,vn=1<<26,Ns=1<<27,Rs=1<<28,Ls=1<<29,Y=1<<30,Ms=1<<31;var bs=1<<25,Os=1<<28,Cs=1<<29,ks=1<<30,Ps=1<<31,Ds=v|E,Fs=v|K|E|X|Y,Us=v|K|E,Is=v|Ye|E|X|Y,Bs=un|ye|ve,Gs=v|ve|ye,gn=v|X|Y|E|vn,Ws=hn|dn|fn|mn|pn|yn,Vs=v|ye|ve|X|Y,Hs=v|K|E,Ks=v|E,Xs=v|K|E|Ye,Ys=gn|ln,$s=Number.MAX_SAFE_INTEGER-1;var $e=256,xn=256,Sn=8192,_n=2048,wn=512,En=256,Tn=$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+Sn]="Sounds",e[e.Images=e.Sounds+_n]="Images",e[e.Lights=e.Images+wn]="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+$e]="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))(je||{}),js=je.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 qe(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 qs=Nn();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 Rn={x:0,y:0,z:0},si=Math.PI/180;var ii=Math.PI/180,oi=180/Math.PI;var g=624,Ln=397,Mn=2567483615,bn=2147483648,On=2147483647,ge=4294967296,Cn=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)}},tt=class{constructor(e={}){this.mt=new Cn(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,T=2;var _e=8,we=16,Pn=32;var Dn=16384;var Q=65536,nt=1<<17,Fn=1<<18,Un=1<<19,In=1<<20,Bn=1<<21,Gn=1<<22,Wn=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|T,gi=x|Q|T|ee|te,xi=x|Q|T,Si=x|nt|T|ee|te,_i=Pn|_e|we,wi=x|we|_e,Hn=x|ee|te|T|Vn,Ei=Fn|Un|In|Bn|Gn|Wn,Ti=x|_e|we|ee|te,Ai=x|Q|T,zi=x|T,Ni=x|Q|T|nt,Ri=Hn|Dn,Li=Number.MAX_SAFE_INTEGER-1;var rt=256,Kn=256,Xn=8192,Yn=2048,$n=512,jn=256,qn=rt*2,Jn=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+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+rt]="General",e[e.WheelWeapons=e.General+qn]="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 it={...Rn};function h(){return{...it}}var Ze=Object.freeze({aiflags:0,last_sighting:it,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={...Ze,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={...Ze,last_sighting:h()},this.combattarget=void 0,this.show_hostile=0,this.light_level=0}},Ee=[{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,b=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!==b&&this.freeList.push(n);let t=this.entities[b];t.inUse=!0,t.classname="worldspawn",this.activeHead=t}get world(){return this.entities[b]}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===b)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===b)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(b))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 ot=Ee.filter(e=>e.save||e.type==="callback"),nr=new Map(ot.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 O(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,t){if(this.targetNameIndex=new Map,this.random=kn(),this.currentTimeSeconds=0,this.pool=new er(e),this.thinkScheduler=new tr,this.callbackToName=new Map,t)for(let[n,r]of t.entries())this.callbackToName.set(r,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)}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 ot){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;case"callback":n[r.name]=s?this.callbackToName.get(s)??null:null;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,t){this.currentTimeSeconds=e.timeSeconds,this.pool.restore(e.pool);let n=new Map;for(let s of this.pool)n.set(s.index,s);let r=[];for(let s of e.entities){let o=n.get(s.index);if(o)for(let[i,a]of Object.entries(s.fields)){let u=nr.get(i);if(!(!u||a===void 0))switch(u.type){case"vec3":O(o,i,sr(a));break;case"entity":r.push({entity:o,name:u.name,targetIndex:a});break;case"inventory":O(o,i,or(a));break;case"boolean":O(o,i,!!a);break;case"callback":if(a){let l=t?.get(a);l&&O(o,i,l)}break;default:O(o,i,a);break}}}for(let s of r){let o=s.targetIndex===null?null:n.get(s.targetIndex)??null;O(s.entity,s.name,o)}this.thinkScheduler.restore(e.thinks,s=>n.get(s))}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 bi=1/40;var Oi=new Map(Ee.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 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||{}),ki=Object.keys(at).length/2;var Se=2,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 wr(e){return e===void 0?{}:f(e,"gameState")}function ct(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:wr(s.gameState),level:fr(s.level),rng:mr(s.rng),entities:xr(s.entities),cvars:Sr(s.cvars),configstrings:_r(s.configstrings),player:s.player?s.player:void 0}}var Pi=new Set(Ee.filter(e=>e.save).map(e=>e.name));var et=globalThis.TextEncoder;function C(e){return ct({...e},{allowNewerVersion:!0})}function Er(e){return et?new et().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,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: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)}))}},Te=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 Ar(s,n,r):this.adapter=new Tr}async save(t,n,r={}){let s=C(n),o={id:t,name:r.name??t,map:s.map,difficulty:s.difficulty,playtimeSeconds:s.playtimeSeconds,timestamp:s.timestamp,version:s.version,bytes:Er(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 ct(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)}};Te.DEFAULT_DB_NAME="quake2ts-saves";Te.DEFAULT_STORE="saves";Te.QUICK_SLOT="quicksave";var q={x:0,y:0,z:0};function ut(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,A=2;var ze=8,Ne=16,zr=32;var Nr=16384;var re=65536,lt=1<<17,Rr=1<<18,Lr=1<<19,Mr=1<<20,br=1<<21,Or=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|A,ao=S|re|A|se|ie,co=S|re|A,uo=S|lt|A|se|ie,lo=zr|ze|Ne,ho=S|Ne|ze,Pr=S|se|ie|A|kr,fo=Rr|Lr|Mr|br|Or|Cr,mo=S|ze|Ne|se|ie,po=S|re|A,yo=S|A,vo=S|re|A|lt,go=Pr|Nr;var xo=Number.MAX_SAFE_INTEGER-1;var ht=256;var Dr=256,Fr=8192,Ur=2048,Ir=512,Br=256,Gr=ht*2,Wr=256,Ae=32;var 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+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+Wr]="Items",e[e.PlayerSkins=e.Items+Br]="PlayerSkins",e[e.General=e.PlayerSkins+ht]="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))(dt||{}),So=dt.MaxConfigStrings;function Vr(){let e=Je({trace(s,o){return{start:s,end:o,fraction:1}}}),t=ut({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 xt(Hr);})();
|
|
2
2
|
//# sourceMappingURL=index.global.js.map
|