@vimp-games/snakes 0.7.8 → 0.7.10

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.
@@ -0,0 +1,8 @@
1
+ import{Container as H,Graphics as P,Sprite as _e,Rectangle as le}from"pixi.js";const ge=4,we='#panel-score:before{content:"★ ";color:#ffd76b}#panel-crystals,#panel-dead,#panel-mode,#panel-time{display:none!important}#stat .stat-leaderboard{padding:12px 0;font:400 16px/1.6 system-ui,sans-serif;color:#e6ecf5}#stat .stat-leaderboard .stat-row{grid-template-columns:3.5em 1fr 5.5em;gap:0 12px;padding:4px 16px;border-radius:6px}#stat .stat-leaderboard .stat-row span:first-child,#stat .stat-leaderboard .stat-row span:last-child{font-variant-numeric:tabular-nums;text-align:right}#stat .stat-leaderboard .stat-row span:first-child{opacity:.6}#stat .stat-leaderboard .stat-row span:last-child{font-weight:700;color:#ffd76b}#stat .stat-leaderboard .stat-row span:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#stat .stat-leaderboard .is-self{background:#3ab7ff2e;color:#7ef9ff}#snakes-gameover{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#060a149e;font:400 16px/1.5 system-ui,sans-serif;color:#e6ecf5}#snakes-gameover[hidden]{display:none}.snakes-gameover-card{min-width:260px;padding:28px 32px;border:1px solid #39507f;border-radius:12px;background:#141c30;box-shadow:0 18px 48px #00000073;text-align:center}.snakes-gameover-card h2{margin:0 0 4px;font-size:22px;font-weight:600;letter-spacing:.02em}.snakes-gameover-score{margin:0 0 6px;opacity:.75}.snakes-gameover-total{margin:0 0 22px;font-size:15px;letter-spacing:.02em;opacity:.6}.snakes-gameover-total span{font-weight:700;color:#ffd76b}.snakes-gameover-score span{font-size:40px;font-weight:700;color:#7ef9ff;vertical-align:-2px}.snakes-gameover-card button{min-width:120px;padding:10px 20px;border:0;border-radius:8px;background:#3ab7ff;color:#06182a;font:inherit;font-weight:600;cursor:pointer}.snakes-gameover-card button:hover,.snakes-gameover-card button:focus-visible{background:#7ed0ff}',be={background:856608,floor:1317936,edge:3756159,edgeWidth:10,rings:4,ringColor:1911111},y={innerScale:.62,innerDarken:.55,smoothing:4,eye:16251903,pupil:1054760,boostGlow:16771466,accolade:{diamondEvery:1.6,diamondLong:.9,diamondWide:.55,inkDark:1054760,inkLight:16645631,diamondStroke:.18,crownScale:1.9,crownLift:.44,crownTint:16766827,crownOutline:1054760,crownOutlineScale:1.16}},ye=.5;class me extends H{constructor(e){super(),this.zIndex=0,!(Array.isArray(e)||e.type==="dynamic")&&this._draw(e)}_draw({map:e,step:t}){const n=e.length,a=(e[0]?.length??0)*t,i=n*t,c=Math.min(a,i)/2,_=a/2,l=i/2,{background:d,floor:f,edge:h,edgeWidth:u,rings:m,ringColor:v}=be,w=new P;w.rect(-a,-i,a*3,i*3),w.fill(d),w.circle(_,l,c),w.fill(f);for(let A=1;A<m;A+=1)w.circle(_,l,c*A/m),w.stroke({color:v,width:2,alpha:ye});w.circle(_,l,c),w.stroke({color:h,width:u,alignment:1}),this.addChild(w)}update(){}destroy(){super.destroy({children:!0})}}const Q=[16731469,16752412,16765503,10214972,3065014,3848191,5531903,11623679,16735432,16250871,8250065,16753828],Z=[8321535,10146047,13154047,12386267,16771466,16757702],J=[{value:1,radius:8},{value:3,radius:13},{value:8,radius:20}],de=16,C=de*2,L={ANGLE:C,RADIUS:C+1,CRYSTALS:C+2,COLOR:C+3,FLAGS:C+4},xe=1,ve=2,Ae=4,ee=.25,ke=.85;function Ee(r){const e=(Math.sin(r/1e3*Ae*Math.PI*2)+1)/2;return ee+(ke-ee)*e}function te(r){return r!=null}function ne(r){const e=t=>{const n=t/255;return n<=.03928?n/12.92:((n+.055)/1.055)**2.4};return .2126*e(r>>16&255)+.7152*e(r>>8&255)+.0722*e(r&255)}function re(r,e){const t=ne(r),n=ne(e);return(Math.max(t,n)+.05)/(Math.min(t,n)+.05)}function Se(r){const{inkDark:e,inkLight:t}=y.accolade;return re(r,e)>=re(r,t)?[e,t]:[t,e]}function Ce(r,e){const t=Math.round((r>>16&255)*e),n=Math.round((r>>8&255)*e),o=Math.round((r&255)*e);return t<<16|n<<8|o}function Le(r,e){const t=r.length-1;if(t<1)return r;const n=[r[0]];for(let o=0;o<t;o+=1){const a=r[Math.max(o-1,0)],i=r[o],c=r[o+1],_=r[Math.min(o+2,t)];for(let l=1;l<=e;l+=1){const d=l/e,f=d*d,h=f*d;n.push([.5*(2*i[0]+(-a[0]+c[0])*d+(2*a[0]-5*i[0]+4*c[0]-_[0])*f+(-a[0]+3*i[0]-3*c[0]+_[0])*h),.5*(2*i[1]+(-a[1]+c[1])*d+(2*a[1]-5*i[1]+4*c[1]-_[1])*f+(-a[1]+3*i[1]-3*c[1]+_[1])*h)])}}return n}class Oe extends H{constructor(e,t={},n={},o={}){super(),this.zIndex=3,this._sound=n.soundManager,this._localPlayer=n.localPlayer,this._id=o.id??null,this._accolades=n.accolades,this._body=new P,this._head=new P,this.addChild(this._body,this._head),this._crownEdge=t?.crown?this._buildCrown(t.crown,y.accolade.crownOutline):null,this._crown=t?.crown?this._buildCrown(t.crown,y.accolade.crownTint):null,this._headAt=[0,0],this._crystals=null,this.update(e)}update(e){const t=e[L.RADIUS]||1,n=e[L.ANGLE]||0,o=e[L.CRYSTALS]||0,a=e[L.FLAGS]||0,i=(a&xe)!==0,c=(a&ve)!==0,_=Q[(e[L.COLOR]||0)%Q.length],l=[];for(let h=0;h<de;h+=1)l.push([e[h*2]||0,e[h*2+1]||0]);this.alpha=c?Ee(performance.now()):1;const{daily:d,monthly:f}=this._accolades?.placeOf(this._id)??{};this._drawBody(l,t,_,i,te(d)),this._drawHead(l[0],n,t,_),this._drawCrown(l[0],n,t,te(f)),this._crystals!==null&&o>this._crystals&&this._play("pickup",l[0]),this._crystals=o,this._headAt=l[0]}_drawBody(e,t,n,o,a){const i=Le(e,y.smoothing),c=this._body;c.clear(),c.moveTo(i[0][0],i[0][1]);for(let _=1;_<i.length;_+=1)c.lineTo(i[_][0],i[_][1]);o&&c.stroke({color:y.boostGlow,width:t*2.6,alpha:.22,cap:"round",join:"round"}),c.stroke({color:n,width:t*2,cap:"round",join:"round"}),c.stroke({color:Ce(n,y.innerDarken),width:t*2*y.innerScale,alpha:.45,cap:"round",join:"round"}),a&&this._drawDiamonds(i,t,n)}_drawDiamonds(e,t,n){const{diamondEvery:o,diamondLong:a,diamondWide:i,diamondStroke:c}=y.accolade,_=this._body,l=t*o,d=t*a,f=t*i,[h,u]=Se(n),m=t*c;let v=l*.5;for(let w=1;w<e.length;w+=1){const[A,V]=e[w-1],[pe,ue]=e[w],G=pe-A,Y=ue-V,k=Math.hypot(G,Y);if(k!==0){for(;v<=k;){const X=v/k,I=A+G*X,W=V+Y*X,N=G/k,z=Y/k;_.moveTo(I+N*d,W+z*d),_.lineTo(I-z*f,W+N*f),_.lineTo(I-N*d,W-z*d),_.lineTo(I+z*f,W-N*f),_.closePath(),_.fill(h),_.stroke({width:m,color:u}),v+=l}v-=k}}}_drawHead([e,t],n,o,a){const i=this._head;i.clear(),i.circle(e,t,o),i.fill(a);const c=Math.cos(n),_=Math.sin(n),l=o*.5,d=o*.42,f=o*.32;for(const h of[-1,1]){const u=e+c*d-_*l*h,m=t+_*d+c*l*h;i.circle(u,m,f),i.fill(y.eye),i.circle(u+c*f*.35,m+_*f*.35,f*.5),i.fill(y.pupil)}}_buildCrown(e,t){const n=new _e(e);return n.anchor.set(.5,1),n.tint=t,n.visible=!1,this.addChild(n),n}_drawCrown([e,t],n,o,a){if(!this._crown||(this._crown.visible=a,this._crownEdge&&(this._crownEdge.visible=a),!a))return;const{crownScale:i,crownLift:c,crownOutlineScale:_}=y.accolade,d=o*i/this._crown.texture.width,f=n+Math.PI/2,h=e+Math.cos(n)*o*c,u=t+Math.sin(n)*o*c;this._crown.scale.set(d),this._crown.rotation=f,this._crown.x=h,this._crown.y=u,this._crownEdge&&(this._crownEdge.scale.set(d*_),this._crownEdge.rotation=f,this._crownEdge.x=h,this._crownEdge.y=u)}_isLocal(){return this._localPlayer?this._localPlayer.is(this._id):(this._warned||(this._warned=!0,console.error("[snakes] the `localPlayer` service is missing: engine too old, game cues stay silent")),!1)}_play(e,[t,n]){!this._sound||!this._isLocal()||this._sound.registerSound(e,{position:{x:t,y:n}})}destroy(){this._play("death",this._headAt),super.destroy({children:!0})}}const D={X:0,Y:1,TIER:2,COLOR:3},Re=32;class Me extends H{constructor(e,t){super(),this.zIndex=2,this._sprite=new _e(t.crystalGem),this._sprite.anchor.set(.5),this.addChild(this._sprite),this.update(e)}update(e){this.x=e[D.X]||0,this.y=e[D.Y]||0;const t=J[e[D.TIER]||0]??J[0];this._sprite.scale.set(t.radius/Re),this._sprite.tint=Z[(e[D.COLOR]||0)%Z.length],this._sprite.rotation=(this.x+this.y)%360*(Math.PI/180)}destroy(){super.destroy({children:!0})}}const Te={Arena:me,Snake:Oe,Crystal:Me};function Pe(r,e){const{radius:t,facets:n}=r,o=t*2,a=new P,i=(d,f,h=0)=>{const u=(f+h)/n*Math.PI*2-Math.PI/2;return[t+Math.cos(u)*d,t+Math.sin(u)*d]},c=[];for(let d=0;d<n;d+=1)c.push(i(t*.94,d));a.poly(c.flat()),a.fill({color:16777215,alpha:.85});const _=[];for(let d=0;d<n;d+=1)_.push(i(t*.5,d,.5));a.poly(_.flat()),a.fill({color:16777215,alpha:1});const l=e.generateTexture({target:a,frame:new le(0,0,o,o)});return a.destroy(!0),l}function Ie(r,e){const{size:t,points:n}=r,o=new P,a=t*.26,i=t*.08,c=t-a,_=t/n,l=[0,c];for(let f=0;f<n;f+=1){const h=(n-1)/2,u=Math.abs(f-h)/(h||1)*t*.18;l.push(f*_,i+u),l.push((f+.5)*_,c*.55)}l.push(t,i+t*.18,t,c),o.poly(l),o.fill({color:16777215,alpha:.92}),o.rect(0,c,t,a),o.fill({color:16777215,alpha:1});const d=e.generateTexture({target:o,frame:new le(0,0,t,t)});return o.destroy(!0),d}const We={crystalGem:Pe,crown:Ie},E="snakes-gameover",Ne=82,se="d",oe="s";function ze(r,e){const t=new KeyboardEvent(r,{keyCode:e,bubbles:!0});t.keyCode!==e&&(Object.defineProperty(t,"keyCode",{value:e}),Object.defineProperty(t,"which",{value:e})),window.dispatchEvent(t)}function De(r){const e={};for(const t of r??[]){const n=String(t).indexOf(":");n>0&&(e[t.slice(0,n)]=Number(t.slice(n+1)))}return e}class Fe{constructor(){this._root=null,this._crystals=null,this._total=null,this._visible=!1,this._lastScore=0}mount(){if(this._root||typeof document>"u")return;const e=document.createElement("div");e.id=E,e.hidden=!0,e.innerHTML=`
2
+ <div class="${E}-card">
3
+ <h2>You crashed</h2>
4
+ <p class="${E}-score"><span>0</span> crystals</p>
5
+ <p class="${E}-total">Total score: <span>0</span></p>
6
+ <button type="button">OK</button>
7
+ </div>
8
+ `,this._crystals=e.querySelector(`.${E}-score span`),this._total=e.querySelector(`.${E}-total span`),e.querySelector("button").addEventListener("click",()=>this._respawn()),document.body.appendChild(e),this._root=e}onPanel(e){if(!this._root)return;const t=De(e);if(oe in t&&(this._lastScore=t[oe]),!(se in t))return;const n=t[se];n>0?this._show(n-1):this._hide()}reset(){this._hide(),this._lastScore=0}_show(e){this._visible||(this._visible=!0,this._crystals.textContent=String(e),this._total.textContent=String(this._lastScore),this._root.hidden=!1)}_hide(){this._visible&&(this._visible=!1,this._root.hidden=!0)}_respawn(){this._hide();for(const e of["keydown","keyup"])ze(e,Ne)}}const je="modulepreload",Ge=function(r){return"/"+r},ie={},Ye=function(e,t,n){let o=Promise.resolve();if(t&&t.length>0){let _=function(l){return Promise.all(l.map(d=>Promise.resolve(d).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),c=i?.nonce||i?.getAttribute("nonce");o=_(t.map(l=>{if(l=Ge(l),l in ie)return;ie[l]=!0;const d=l.endsWith(".css"),f=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${f}`))return;const h=document.createElement("link");if(h.rel=d?"stylesheet":je,d||(h.as="script"),h.crossOrigin="",h.href=l,c&&h.setAttribute("nonce",c),document.head.appendChild(h),d)return new Promise((u,m)=>{h.addEventListener("load",u),h.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}function a(i){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=i,window.dispatchEvent(c),!c.defaultPrevented)throw i}return o.then(i=>{for(const c of i||[])c.status==="rejected"&&a(c.reason);return e().catch(a)})},$e=r=>(r??"").endsWith(".js"),Be=r=>import(r),Ue=()=>Ye(()=>Promise.resolve().then(()=>Je),[]),$=new Fe,tt={id:"snakes",engineApi:ge,async createClientCore(r,{wasmUrl:e}={}){if($e(e)){const a=await Be(e);return{core:new a.ClientCore(r),memory:null}}const{default:t,ClientCore:n}=await Ue(),o=await t({module_or_path:e});return{core:new n(r),memory:o.memory}},parts:Te,bakers:We,styles:we,hooks:{onAuth(r,e){r.set_model(e.model),$.mount(),$.reset()},onPanel(r,e){r.sync_panel(JSON.stringify(e)),$.onPanel(e)},onLocalAction(){return null}}};class U{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,ce.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_clientcore_free(e,0)}abi_describe(){let e,t;try{const n=s.clientcore_abi_describe(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}apply_aim(e,t,n,o){s.clientcore_apply_aim(this.__wbg_ptr,e,t,n,o)}apply_input(e,t,n){const o=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),a=p,i=g(t,s.__wbindgen_malloc,s.__wbindgen_realloc),c=p;s.clientcore_apply_input(this.__wbg_ptr,o,a,i,c,n)}debug_json(){let e,t;try{const n=s.clientcore_debug_json(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}decode_frame(e){let t,n;try{const o=M(e,s.__wbindgen_malloc),a=p,i=s.clientcore_decode_frame(this.__wbg_ptr,o,a);return t=i[0],n=i[1],b(i[0],i[1])}finally{s.__wbindgen_free(t,n,1)}}dispatch(e,t){const n=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),o=p,a=M(t,s.__wbindgen_malloc),i=p,c=s.clientcore_dispatch(this.__wbg_ptr,n,o,a,i);var _=F(c[0],c[1]).slice();return s.__wbindgen_free(c[0],c[1]*1,1),_}hot_ptr(){return s.clientcore_hot_ptr(this.__wbg_ptr)>>>0}hot_values(){const e=s.clientcore_hot_values(this.__wbg_ptr);var t=q(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}my_game_id(){return s.clientcore_my_game_id(this.__wbg_ptr)}constructor(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=p,o=s.clientcore_new(t,n);if(o[2])throw x(o[1]);return this.__wbg_ptr=o[0],ce.register(this,this.__wbg_ptr,this),this}offset(){return s.clientcore_offset(this.__wbg_ptr)}push_frame(e,t){const n=M(e,s.__wbindgen_malloc),o=p;return s.clientcore_push_frame(this.__wbg_ptr,n,o,t)!==0}reset(){s.clientcore_reset(this.__wbg_ptr)}resync(){s.clientcore_resync(this.__wbg_ptr)}sample(e){return s.clientcore_sample(this.__wbg_ptr,e)>>>0}set_active(e){s.clientcore_set_active(this.__wbg_ptr,e)}set_map(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=p,o=s.clientcore_set_map(this.__wbg_ptr,t,n);if(o[1])throw x(o[0])}set_model(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=p;s.clientcore_set_model(this.__wbg_ptr,t,n)}sync_panel(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=p;s.clientcore_sync_panel(this.__wbg_ptr,t,n)}take_divergence(){let e,t;try{const n=s.clientcore_take_divergence(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}take_frames(){let e,t;try{const n=s.clientcore_take_frames(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(U.prototype[Symbol.dispose]=U.prototype.free);class K{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,ae.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_gamecore_free(e,0)}abi_describe(){let e,t;try{const n=s.gamecore_abi_describe(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}alive_players(){const e=s.gamecore_alive_players(this.__wbg_ptr);var t=q(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}apply_aim(e,t,n,o,a){s.gamecore_apply_aim(this.__wbg_ptr,e,t,n,o,a)}apply_input(e,t,n,o){const a=g(n,s.__wbindgen_malloc,s.__wbindgen_realloc),i=p,c=g(o,s.__wbindgen_malloc,s.__wbindgen_realloc),_=p;s.gamecore_apply_input(this.__wbg_ptr,e,t,a,i,c,_)}body_has_events(){return s.gamecore_body_has_events(this.__wbg_ptr)!==0}clear(){s.gamecore_clear(this.__wbg_ptr)}debug_json(){let e,t;try{const n=s.gamecore_debug_json(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}deserialize_state(e){const t=M(e,s.__wbindgen_malloc),n=p,o=s.gamecore_deserialize_state(this.__wbg_ptr,t,n);if(o[1])throw x(o[0])}dispatch(e,t){const n=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),o=p,a=M(t,s.__wbindgen_malloc),i=p,c=s.gamecore_dispatch(this.__wbg_ptr,n,o,a,i);var _=F(c[0],c[1]).slice();return s.__wbindgen_free(c[0],c[1]*1,1),_}frame_bytes(){const e=s.gamecore_frame_bytes(this.__wbg_ptr);var t=F(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}frame_ptr(){return s.gamecore_frame_ptr(this.__wbg_ptr)>>>0}is_alive(e){return s.gamecore_is_alive(this.__wbg_ptr,e)!==0}last_input_seq(e){return s.gamecore_last_input_seq(this.__wbg_ptr,e)>>>0}load_map(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=p,o=s.gamecore_load_map(this.__wbg_ptr,t,n);if(o[1])throw x(o[0])}map_info(){let e,t;try{const n=s.gamecore_map_info(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}constructor(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=p,o=s.gamecore_new(t,n);if(o[2])throw x(o[1]);return this.__wbg_ptr=o[0],ae.register(this,this.__wbg_ptr,this),this}pack_body(){const e=s.gamecore_pack_body(this.__wbg_ptr);if(e[1])throw x(e[0])}pack_frame(e,t,n,o,a,i,c,_){var l=qe(c)?0:g(c,s.__wbindgen_malloc,s.__wbindgen_realloc),d=p;return s.gamecore_pack_frame(this.__wbg_ptr,e,t,n,o,a,i,l,d,_)>>>0}players_data(){let e,t;try{const n=s.gamecore_players_data(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}position_of(e){const t=s.gamecore_position_of(this.__wbg_ptr,e);var n=q(t[0],t[1]).slice();return s.__wbindgen_free(t[0],t[1]*4,4),n}remove_actor(e){s.gamecore_remove_actor(this.__wbg_ptr,e)}remove_players_and_shots(){let e,t;try{const n=s.gamecore_remove_players_and_shots(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}remove_scripted_actor(e){s.gamecore_remove_scripted_actor(this.__wbg_ptr,e)}reset_actor(e,t,n,o,a){s.gamecore_reset_actor(this.__wbg_ptr,e,t,n,o,a)}reset_all_vitals(){s.gamecore_reset_all_vitals(this.__wbg_ptr)}serialize_state(){const e=s.gamecore_serialize_state(this.__wbg_ptr);if(e[3])throw x(e[2]);var t=F(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}spawn_actor(e,t,n,o,a,i){const c=g(t,s.__wbindgen_malloc,s.__wbindgen_realloc),_=p,l=s.gamecore_spawn_actor(this.__wbg_ptr,e,c,_,n,o,a,i);if(l[1])throw x(l[0])}spawn_scripted_actor(e,t,n,o,a,i){const c=g(t,s.__wbindgen_malloc,s.__wbindgen_realloc),_=p,l=s.gamecore_spawn_scripted_actor(this.__wbg_ptr,e,c,_,n,o,a,i);if(l[1])throw x(l[0])}step(e){s.gamecore_step(this.__wbg_ptr,e)}take_events(){let e,t;try{const n=s.gamecore_take_events(this.__wbg_ptr);return e=n[0],t=n[1],b(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(K.prototype[Symbol.dispose]=K.prototype.free);function fe(){return{__proto__:null,"./vimp_snakes_core_bg.js":{__proto__:null,__wbg_Error_408e67f47ca7b58b:function(e,t){return Error(b(e,t))},__wbg___wbindgen_throw_bb96b2010945f0bc:function(e,t){throw new Error(b(e,t))},__wbindgen_init_externref_table:function(){const e=s.__wbindgen_externrefs,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)}}}}const ce=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(r=>s.__wbg_clientcore_free(r,1)),ae=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(r=>s.__wbg_gamecore_free(r,1));function q(r,e){return r=r>>>0,Ke().subarray(r/4,r/4+e)}function F(r,e){return r=r>>>0,S().subarray(r/1,r/1+e)}let O=null;function Ke(){return(O===null||O.byteLength===0)&&(O=new Float32Array(s.memory.buffer)),O}function b(r,e){return Ve(r>>>0,e)}let R=null;function S(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(s.memory.buffer)),R}function qe(r){return r==null}function M(r,e){const t=e(r.length*1,1)>>>0;return S().set(r,t/1),p=r.length,t}function g(r,e,t){if(t===void 0){const c=T.encode(r),_=e(c.length,1)>>>0;return S().subarray(_,_+c.length).set(c),p=c.length,_}let n=r.length,o=e(n,1)>>>0;const a=S();let i=0;for(;i<n;i++){const c=r.charCodeAt(i);if(c>127)break;a[o+i]=c}if(i!==n){i!==0&&(r=r.slice(i)),o=t(o,n,n=i+r.length*3,1)>>>0;const c=S().subarray(o+i,o+n),_=T.encodeInto(r,c);i+=_.written,o=t(o,n,i,1)>>>0}return p=i,o}function x(r){const e=s.__wbindgen_externrefs.get(r);return s.__externref_table_dealloc(r),e}let j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});j.decode();const He=2146435072;let B=0;function Ve(r,e){return B+=e,B>=He&&(j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),j.decode(),B=e),j.decode(S().subarray(r,r+e))}const T=new TextEncoder;"encodeInto"in T||(T.encodeInto=function(r,e){const t=T.encode(r);return e.set(t),{read:r.length,written:t.length}});let p=0,s;function he(r,e){return s=r.exports,O=null,R=null,s.__wbindgen_start(),s}async function Xe(r,e){if(typeof Response=="function"&&r instanceof Response){if(!r.ok)throw new Error(`failed to fetch Wasm: ${r.status} ${r.statusText} fetching '${r.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(r,e)}catch(o){if(t(r.type)&&r.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",o);else throw o}const n=await r.arrayBuffer();return await WebAssembly.instantiate(n,e)}else{const n=await WebAssembly.instantiate(r,e);return n instanceof WebAssembly.Instance?{instance:n,module:r}:n}function t(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function Qe(r){if(s!==void 0)return s;r!==void 0&&(Object.getPrototypeOf(r)===Object.prototype?{module:r}=r:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=fe();r instanceof WebAssembly.Module||(r=new WebAssembly.Module(r));const t=new WebAssembly.Instance(r,e);return he(t)}async function Ze(r){if(s!==void 0)return s;r!==void 0&&(Object.getPrototypeOf(r)===Object.prototype?{module_or_path:r}=r:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),r===void 0&&(r=new URL("/assets/vimp_snakes_core_bg-DvQ3CEdW.wasm",import.meta.url));const e=fe();(typeof r=="string"||typeof Request=="function"&&r instanceof Request||typeof URL=="function"&&r instanceof URL)&&(r=fetch(r));const{instance:t,module:n}=await Xe(await r,e);return he(t)}const Je=Object.freeze(Object.defineProperty({__proto__:null,ClientCore:U,GameCore:K,default:Ze,initSync:Qe},Symbol.toStringTag,{value:"Module"}));export{tt as default};
@@ -8,6 +8,10 @@
8
8
  export class ClientCore {
9
9
  free(): void;
10
10
  [Symbol.dispose](): void;
11
+ /**
12
+ * Зеркало `abi_describe` игрового ядра (см. игровой макрос).
13
+ */
14
+ abi_describe(): string;
11
15
  /**
12
16
  * Ввод указателем: мировая точка + биты состояния — в историю
13
17
  * предикта.
@@ -30,6 +34,10 @@ export class ClientCore {
30
34
  * 'null' при несовпадении версии или повреждённом кадре.
31
35
  */
32
36
  decode_frame(data: Uint8Array): string;
37
+ /**
38
+ * Зеркало `dispatch` игрового ядра (см. игровой макрос).
39
+ */
40
+ dispatch(op: string, payload: Uint8Array): Uint8Array;
33
41
  /**
34
42
  * Указатель на hot-буфер (zero-copy чтение из JS:
35
43
  * new Float32Array(wasm.memory.buffer, ptr, len) — view
@@ -125,6 +133,12 @@ export class ClientCore {
125
133
  export class GameCore {
126
134
  free(): void;
127
135
  [Symbol.dispose](): void;
136
+ /**
137
+ * Самоописание ядра (JSON: версия формата, версия движкового
138
+ * крейта, список опкодов dispatch). Движок читает его один раз
139
+ * при загрузке — до первого вызова, а не посреди матча.
140
+ */
141
+ abi_describe(): string;
128
142
  /**
129
143
  * Живые игроки плоским массивом [id, teamId, x, y, ...]
130
144
  * (аналог Game.getAlivePlayers для меты).
@@ -158,6 +172,13 @@ export class GameCore {
158
172
  */
159
173
  debug_json(): string;
160
174
  deserialize_state(data: Uint8Array): void;
175
+ /**
176
+ * Единая точка роста ABI: новая возможность приезжает опкодом,
177
+ * а не новым символом (таблица экспортов заморожена). Пустой
178
+ * возврат — «опкод не обработан», `[0x00]` — «обработан, ответа
179
+ * нет».
180
+ */
181
+ dispatch(op: string, payload: Uint8Array): Uint8Array;
161
182
  /**
162
183
  * Копия последнего кадра (nodejs-таргет не отдаёт память
163
184
  * наружу; горячий путь браузера использует frame_ptr + память
@@ -15,6 +15,22 @@ class ClientCore {
15
15
  const ptr = this.__destroy_into_raw();
16
16
  wasm.__wbg_clientcore_free(ptr, 0);
17
17
  }
18
+ /**
19
+ * Зеркало `abi_describe` игрового ядра (см. игровой макрос).
20
+ * @returns {string}
21
+ */
22
+ abi_describe() {
23
+ let deferred1_0;
24
+ let deferred1_1;
25
+ try {
26
+ const ret = wasm.clientcore_abi_describe(this.__wbg_ptr);
27
+ deferred1_0 = ret[0];
28
+ deferred1_1 = ret[1];
29
+ return getStringFromWasm0(ret[0], ret[1]);
30
+ } finally {
31
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
32
+ }
33
+ }
18
34
  /**
19
35
  * Ввод указателем: мировая точка + биты состояния — в историю
20
36
  * предикта.
@@ -79,6 +95,22 @@ class ClientCore {
79
95
  wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
80
96
  }
81
97
  }
98
+ /**
99
+ * Зеркало `dispatch` игрового ядра (см. игровой макрос).
100
+ * @param {string} op
101
+ * @param {Uint8Array} payload
102
+ * @returns {Uint8Array}
103
+ */
104
+ dispatch(op, payload) {
105
+ const ptr0 = passStringToWasm0(op, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
106
+ const len0 = WASM_VECTOR_LEN;
107
+ const ptr1 = passArray8ToWasm0(payload, wasm.__wbindgen_malloc);
108
+ const len1 = WASM_VECTOR_LEN;
109
+ const ret = wasm.clientcore_dispatch(this.__wbg_ptr, ptr0, len0, ptr1, len1);
110
+ var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
111
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
112
+ return v3;
113
+ }
82
114
  /**
83
115
  * Указатель на hot-буфер (zero-copy чтение из JS:
84
116
  * new Float32Array(wasm.memory.buffer, ptr, len) — view
@@ -275,6 +307,24 @@ class GameCore {
275
307
  const ptr = this.__destroy_into_raw();
276
308
  wasm.__wbg_gamecore_free(ptr, 0);
277
309
  }
310
+ /**
311
+ * Самоописание ядра (JSON: версия формата, версия движкового
312
+ * крейта, список опкодов dispatch). Движок читает его один раз
313
+ * при загрузке — до первого вызова, а не посреди матча.
314
+ * @returns {string}
315
+ */
316
+ abi_describe() {
317
+ let deferred1_0;
318
+ let deferred1_1;
319
+ try {
320
+ const ret = wasm.gamecore_abi_describe(this.__wbg_ptr);
321
+ deferred1_0 = ret[0];
322
+ deferred1_1 = ret[1];
323
+ return getStringFromWasm0(ret[0], ret[1]);
324
+ } finally {
325
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
326
+ }
327
+ }
278
328
  /**
279
329
  * Живые игроки плоским массивом [id, teamId, x, y, ...]
280
330
  * (аналог Game.getAlivePlayers для меты).
@@ -359,6 +409,25 @@ class GameCore {
359
409
  throw takeFromExternrefTable0(ret[0]);
360
410
  }
361
411
  }
412
+ /**
413
+ * Единая точка роста ABI: новая возможность приезжает опкодом,
414
+ * а не новым символом (таблица экспортов заморожена). Пустой
415
+ * возврат — «опкод не обработан», `[0x00]` — «обработан, ответа
416
+ * нет».
417
+ * @param {string} op
418
+ * @param {Uint8Array} payload
419
+ * @returns {Uint8Array}
420
+ */
421
+ dispatch(op, payload) {
422
+ const ptr0 = passStringToWasm0(op, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
423
+ const len0 = WASM_VECTOR_LEN;
424
+ const ptr1 = passArray8ToWasm0(payload, wasm.__wbindgen_malloc);
425
+ const len1 = WASM_VECTOR_LEN;
426
+ const ret = wasm.gamecore_dispatch(this.__wbg_ptr, ptr0, len0, ptr1, len1);
427
+ var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
428
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
429
+ return v3;
430
+ }
362
431
  /**
363
432
  * Копия последнего кадра (nodejs-таргет не отдаёт память
364
433
  * наружу; горячий путь браузера использует frame_ptr + память
@@ -3,10 +3,12 @@
3
3
  export const memory: WebAssembly.Memory;
4
4
  export const __wbg_clientcore_free: (a: number, b: number) => void;
5
5
  export const __wbg_gamecore_free: (a: number, b: number) => void;
6
+ export const clientcore_abi_describe: (a: number) => [number, number];
6
7
  export const clientcore_apply_aim: (a: number, b: number, c: number, d: number, e: number) => void;
7
8
  export const clientcore_apply_input: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
8
9
  export const clientcore_debug_json: (a: number) => [number, number];
9
10
  export const clientcore_decode_frame: (a: number, b: number, c: number) => [number, number];
11
+ export const clientcore_dispatch: (a: number, b: number, c: number, d: number, e: number) => [number, number];
10
12
  export const clientcore_hot_ptr: (a: number) => number;
11
13
  export const clientcore_hot_values: (a: number) => [number, number];
12
14
  export const clientcore_my_game_id: (a: number) => number;
@@ -22,6 +24,7 @@ export const clientcore_set_model: (a: number, b: number, c: number) => void;
22
24
  export const clientcore_sync_panel: (a: number, b: number, c: number) => void;
23
25
  export const clientcore_take_divergence: (a: number) => [number, number];
24
26
  export const clientcore_take_frames: (a: number) => [number, number];
27
+ export const gamecore_abi_describe: (a: number) => [number, number];
25
28
  export const gamecore_alive_players: (a: number) => [number, number];
26
29
  export const gamecore_apply_aim: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
27
30
  export const gamecore_apply_input: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
@@ -29,6 +32,7 @@ export const gamecore_body_has_events: (a: number) => number;
29
32
  export const gamecore_clear: (a: number) => void;
30
33
  export const gamecore_debug_json: (a: number) => [number, number];
31
34
  export const gamecore_deserialize_state: (a: number, b: number, c: number) => [number, number];
35
+ export const gamecore_dispatch: (a: number, b: number, c: number, d: number, e: number) => [number, number];
32
36
  export const gamecore_frame_bytes: (a: number) => [number, number];
33
37
  export const gamecore_frame_ptr: (a: number) => number;
34
38
  export const gamecore_is_alive: (a: number, b: number) => number;
@@ -51,8 +55,8 @@ export const gamecore_spawn_scripted_actor: (a: number, b: number, c: number, d:
51
55
  export const gamecore_step: (a: number, b: number) => void;
52
56
  export const gamecore_take_events: (a: number) => [number, number];
53
57
  export const __wbindgen_externrefs: WebAssembly.Table;
58
+ export const __wbindgen_free: (a: number, b: number, c: number) => void;
54
59
  export const __wbindgen_malloc: (a: number, b: number) => number;
55
60
  export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
56
- export const __wbindgen_free: (a: number, b: number, c: number) => void;
57
61
  export const __externref_table_dealloc: (a: number) => void;
58
62
  export const __wbindgen_start: () => void;
@@ -0,0 +1 @@
1
+ const Q=Array.from({length:16},(n,e)=>[{name:`p${e}x`,ty:"f32",interp:"lerp"},{name:`p${e}y`,ty:"f32",interp:"lerp"}]).flat(),X={s1:{id:1,kind:"indexed8",class:"hot",fields:[...Q,{name:"angle",ty:"f32",interp:"lerpAngle"},{name:"radius",ty:"f32",interp:"lerp"},{name:"crystals",ty:"u16"},{name:"color",ty:"u8"},{name:"boost",ty:"u8"}]},cr:{id:2,kind:"indexed32",class:"event",fields:[{name:"x",ty:"f32"},{name:"y",ty:"f32"},{name:"tier",ty:"u8"},{name:"color",ty:"u8"}]},c1:{id:3,kind:"indexedNoNull8",class:"hot",fields:[{name:"x",ty:"f32",interp:"lerp"},{name:"y",ty:"f32",interp:"lerp"},{name:"angle",ty:"f32",interp:"lerpAngle"}]}},I=[16731469,16752412,16765503,10214972,3065014,3848191,5531903,11623679,16735432,16250871,8250065,16753828],Z=n=>`#${I[n%I.length].toString(16).padStart(6,"0")}`,J=[{value:1,radius:8},{value:3,radius:13},{value:8,radius:20}],A={s1:{baseSpeed:260,boostFactor:1.9,turnSpeed:3.4,turnSpeedFalloff:.18,turnSpeedMin:1.4,baseRadius:14,radiusGain:1.6,baseLength:150,lengthPerCrystal:9,pointSpacing:6,boostDrainPerSecond:6,boostMinCrystals:2,world:{maxCrystals:60,spawnInterval:.35,tierWeights:[70,25,5],tiers:J,dropRatio:.8,edgeMargin:60,startCrystals:0,spawnGraceSeconds:2}}},ee={},W=128,D=1,te=20,O=8,P=4,C=64,re=Math.PI*(3-Math.sqrt(5)),ne=.72,se=25;function T(n){const e=Math.ceil(Math.max(n,0)/P)*P,t=Math.max(e,O);return Math.round(te*Math.sqrt(t/O))}const L=Math.log2(C);if(!Number.isInteger(L))throw new Error(`RESPAWN_COUNT must be a power of two (the order is bit-reversed), got ${C}`);function ae(n){let e=0;for(let t=0;t<L;t+=1)e=e<<1|n>>t&1;return e}function ie(n){const e=n*W/2,t=e;return Array.from({length:C},(r,a)=>{const i=ae(a),o=e*ne*Math.sqrt((i+.5)/C),c=i*re,_=t+Math.cos(c)*o,l=t+Math.sin(c)*o,h=(a*.6180339887%1*2-1)*se,m=c*180/Math.PI+180+h;return[Math.round(_),Math.round(l),Math.round((m%360+360)%360)]})}function U(n=0){const e=T(n);return{setId:"c1",scale:1,step:W,physicsStatic:[],physicsDynamic:[],layers:{1:[D]},map:Array.from({length:e},()=>Array.from({length:e},()=>D)),respawns:{players:ie(e)}}}const oe=U(0),ce={arena:oe},_e={title:"Snakes",parts:{models:A,weapons:ee,friendlyFire:!1},snapshot:X,soundCues:{roundStart:null,victory:null,defeat:null,frag:null,death:null},maps:ce,currentMap:"arena",mapScale:1,mapSetId:"c1",mapsInVote:1,timers:{timeStep:1e3/120,networkSendRate:4,roundTime:36e5,mapTime:36e5,roomTimeMin:1e4,roomTimeMax:36e5,voteTime:1e4,timeBlockedVote:3e4,teamChangeGracePeriod:1e4,roundRestartDelay:5e3,mapChangeDelay:2e3,rttPingInterval:3e3,idleCheckInterval:3e4},playerState:{defaultState:{best:0,eaten:0}},noSpectators:!0,endlessRound:!0,statMode:"leaderboard",teams:{players:1},scripted:{namePrefix:"Snake",defaultModel:"s1"},playerKeys:{left:{key:1},right:{key:2},boost:{key:4},respawn:{key:8,type:1}},panel:{fields:{crystals:{key:"c",value:0},score:{key:"s",value:0},dead:{key:"d",value:0}},activeKey:"wa"},stat:{name:{key:0,bodyMethod:"=",headSync:!0,headMethod:"#"},status:{key:1,bodyMethod:"=",bodyValue:"",headValue:""},score:{key:2,bodyMethod:"=",bodyValue:0,headMethod:"+",headValue:0},latency:{key:3,bodyMethod:"="}},roomDefaults:{maxPlayers:32},roomForm:[{name:"maxPlayers",control:"text",label:"Max players",numeric:!0},{name:"map",control:"select",label:"Map",source:"maps"}]},le={elems:{authId:"auth",fieldsId:"auth-fields",errorId:"auth-error",enterId:"auth-enter",titleId:"auth-title",informsId:"auth-informs"},texts:{title:"Snakes",sections:[{heading:"How to play",lines:[{keys:"a, d",text:"turn"},{keys:"w",text:"boost (burns crystals)"},{keys:"r",text:"respawn after a crash"},{separator:!0},{keys:"",text:"eat crystals to grow"},{keys:"",text:"the edge and other snakes kill you"},{keys:"",text:"your own tail does not"},{separator:!0},{keys:"c",text:"chat"},{keys:"<Tab>",text:"stats",last:!0}]}]},params:[{name:"model",value:"s1",options:{control:"select",label:"Snake",options:Object.keys(A),validator:"isValidModel",storage:"model"}}],validators:{isValidModel:n=>n in A}},de={pickup:{file:"shot",priority:80,volume:.35},death:{file:"death",priority:150,volume:.5}},pe={codecList:["webm","mp3"],sounds:de},ue={parts:{gameSets:{s1:["Snake"],cr:["Crystal"],c1:["Arena"]},entitiesOnCanvas:{Arena:"vimp",Snake:"vimp",Crystal:"vimp"},bakedAssets:{vimp:[{name:"crystalGem",component:"Crystal",params:{radius:32,facets:6}},{name:"crown",component:"Snake",params:{size:64,points:3}}]},componentDependencies:{soundManager:["Snake"],localPlayer:["Snake"],accolades:["Snake"]},sounds:pe},initIdList:["vimp","panel","chat"],modules:{canvasManager:{canvases:{vimp:{width:960,height:600,aspectRatio:"16:10",baseScale:"1:1",dynamicCamera:!0,shakeCamera:!1}}},controls:{modes:{77:""},keySetList:[{78:"nextPlayer",80:"prevPlayer"},{65:"left",68:"right",87:"boost",82:"respawn"}],pointer:{keySets:[1],doubleTapMs:300,doubleTapPx:40,sendIntervalMs:50}},chat:{params:{messages:{s:["The arena is full. You will join as soon as a place frees up","You are already in the arena","You are in the arena","You are watching the arena","{0} crashed into {1}","{0} joined the game","{0} left the game"],v:["A vote has been created","Voting has started","Your vote has been accepted","Voting is temporarily unavailable","Vote passed","Vote failed"],m:["Current map: {0}","Next map: {0}"],c:["Command not found","Your place today: {0} of {1} ({2} points)"],n:["Invalid name","{0} changed name to {1}"],g:["Bot snakes in the arena: {0}","Invalid bot count"]}}},panel:{keys:{s:"score",c:"crystals",d:"dead",wa:"mode",t:"time"},fields:[{name:"score",elem:"panel-score",type:"value"},{name:"crystals",elem:"panel-crystals",type:"value"},{name:"dead",elem:"panel-dead",type:"value"},{name:"mode",elem:"panel-mode",type:"weapon"},{name:"time",elem:"panel-time",type:"time"}]},stat:{params:{mode:"leaderboard",period:"day",limit:10,columns:["#","snake","score"]}}},gameInform:{list:["{0} WINS!","SLITHER!","GAME OVER!"]}};class he{constructor({participants:e,coreAdapter:t,socketManager:r},a){this._participants=e,this._coreAdapter=t,this._socketManager=r,this._scriptedManager=a,this._vimp=null,this._population=null,this._size=null,this._mapData=null,this._delivered=new Map}onCoreEvent(e,t={}){t.vimp&&(this._vimp=t.vimp),!(!e||e.type!=="population")&&this._apply(Number(e.count)||0)}_apply(e){const t=this._sizeFor(e);if(t!==this._size){this._size=t,this._population=e;const r=U(e);this._coreAdapter.createMap(r),this._scriptedManager?.createMap(r),this._vimp?.overrideMapData?.(r),this._mapData=r,this._delivered.clear()}this._broadcast()}_sizeFor(e){if(this._size===null)return T(e);const t=T(e);return t>this._size||e<=this._population-P?t:this._size}_broadcast(){if(!this._mapData)return;const e=this._participants.getHumans(),t=new Set;for(const r of e)t.add(r.socketId),!(!r.isReady||this._delivered.get(r.socketId)===this._size)&&(this._delivered.set(r.socketId,this._size),this._socketManager.sendMap(r.socketId,this._mapData));for(const r of this._delivered.keys())t.has(r)||this._delivered.delete(r)}reapply(){this._mapData&&(this._vimp?.overrideMapData?.(this._mapData),this._coreAdapter.createMap(this._mapData),this._scriptedManager?.createMap(this._mapData),this._broadcast())}get mapData(){return this._mapData??null}}class fe{constructor({participants:e}){this._participants=e}onCoreEvent(e){if(!e||e.type!=="spawn")return;const t=Number(e.color);!Number.isFinite(t)||t<0||this._participants?.setChatColor?.(String(e.id),Z(t))}}class me{constructor({participants:e,coreAdapter:t,panel:r,stat:a,scripted:i}){this._participants=e,this._coreAdapter=t,this._panel=r,this._stat=a,this._model=i.defaultModel,this._respawns=null}createMap(e){this._respawns=e.respawns}getCountsPerTeam(){const e={};for(const t of this._participants.getScripted())e[t.team]=(e[t.team]??0)+1;return e}createScripted(e,t=null){if(!this._respawns)return 0;const r=this._participants.getPlayableTeams();let a=0;for(let i=0;i<e&&!this._participants.isFull;i+=1){const o=t??this._pickTeam(r);if(!o||!this._hasRoom(o))break;const c=this._participants.createScripted({team:o,model:this._model}),_=this._participants.get(c);this._stat.addUser(c,_.teamId,{name:_.name,status:"",latency:"BOT"}),this._panel.addUser(c),a+=1}return a}_hasRoom(e){const t=this._respawns[e];return!!(t&&this._participants.getTeamSize(e)<t.length)}_pickTeam(e){return[...e].sort((t,r)=>this._participants.getTeamSize(t)-this._participants.getTeamSize(r)).find(t=>this._hasRoom(t))??null}removeScripted(e=null){const t=this._participants.getScripted();(e?t.filter(a=>a.team===e):t).forEach(a=>this._remove(a.gameId))}removeOneForHuman(e){for(const t of this._participants.getScripted())if(t.team===e)return this._remove(t.gameId),!0;return!1}_remove(e){const t=this._participants.get(e);!t||!t.isScripted||(this._stat.removeUser(e,t.teamId),this._panel.removeUser(e),this._coreAdapter.removePlayer(e),this._participants.remove(e))}}const ge=15;class be{constructor({participants:e,stat:t}){this._participants=e,this._stat=t,this._totals=new Map}onCoreEvent(e,t={}){if(!e||typeof e!="object")return;const{vimp:r,panel:a}=t,i=String(e.id);switch(e.type){case"crystals":this._onCrystals(i,Number(e.gained)||0,r,a);break;case"burn":this._onBurn(i,Number(e.burned)||0,r,a);break;case"death":this._onDeath(i,e,r,a);break;case"respawn":this._onRespawn(i,r,a);break;case"population":this._publishNewcomers(r,a),r?.flushPlayerData?.();break}}reset(e){this._totals.delete(e)}_onCrystals(e,t,r,a){const i=this._record(e);!i||t<=0||(i.eaten+=t,i.score+=t,this._publish(e,i,r,a))}_onBurn(e,t,r,a){const i=this._record(e);!i||t<=0||(i.score=Math.max(0,i.score-t),this._publish(e,i,r,a))}_onDeath(e,t,r,a){const i=this._record(e);if(!i)return;const o=t.killer===null||t.killer===void 0?null:String(t.killer);if(o!==null&&o!==e){const l=this._record(o);l&&(l.kills+=1,l.score+=ge,this._publish(o,l,r,a))}this._publish(e,i,r,a);const _=r?.isPlayerRatingLoaded?.(e,"day")===!0?r.getPlayerRating?.(e,"day")?.value??0:1/0;r?.addPlayerPoints?.(e,i.score),r?.finishPlayerGame?.(e),this._recordBest(e,i,r),r?.flushPlayerData?.({urgent:i.score>_})}_onRespawn(e,t,r){const a=this._record(e);a&&(a.eaten=0,a.kills=0,a.score=0,a.flushedEaten=0,this._publish(e,a,t,r))}_record(e){const t=this._participants.get(e);if(!t)return null;const r=this._totals.get(e);if(r&&r.participant===t)return r;const a={participant:t,eaten:0,kills:0,score:0,flushedEaten:0,published:!1};return this._totals.set(e,a),a}_publishNewcomers(e,t){for(const r of this._participants.getAll()){const a=r.gameId,i=this._totals.get(a),o=i?.participant===r?i:this._record(a);o&&!o.published&&this._publish(a,o,e,t)}}_publish(e,t,r,a){const{score:i}=t;t.published=!0,this._stat.updateUser(e,t.participant.teamId,{score:i}),a&&a.updateUser(e,"score",i,"set")}_recordBest(e,t,r){if(!r?.getPlayerState)return;const a=r.getPlayerState(e);if(!a)return;const i=t.eaten-t.flushedEaten;t.flushedEaten=t.eaten;const o=Math.max(Number(a.best)||0,t.score),c=(Number(a.eaten)||0)+i;r.setPlayerState(e,{...a,best:o,eaten:c})}}let j=null,V=null,G=null;function ye(n){const e=new me(n);return j=new be(n),V=new he(n,e),G=new fe(n),{scripted:e}}function we(){return j}function $(){return V}function ve(){return G}const Se={name:"/bot",handler(n,e,t){const r=Number(t[0]);if(t[0]===void 0||!Number.isFinite(r)||r<0){n.chat.pushSystemByUser(e,"BOT_COUNT_INVALID");return}const{maxPlayers:a}=n.participants,i=Math.trunc(r),o=a>0?Math.min(i,a):i;n.scripted.removeScripted();const c=o>0?n.scripted.createScripted(o):0;n.chat.pushSystem("BOTS_SET",[c]),c>0&&(n.roundManager.initiateNewRound(),$()?.reapply())}},ke={name:"/name",handler(n,e,t){n.roundManager.changeName(e,t.join(" "))}},Me={name:"/nr",handler(n,e){n.isDevMode?n.roundManager.initiateNewRound():n.chat.pushSystemByUser(e,"COMMANDS_NOT_FOUND")}},Ce={name:"/rank",async handler(n,e){let t=null;try{t=await n.playerDataSync?.refreshPlacement?.(e,"day")}catch{t=n.playerDataSync?.getRating?.(e,"day")??null}const{value:r=0,placement:a=null,total:i=0}=t??{};n.chat.pushSystemByUser(e,"RANK",[a??"—",i,r])}},Ee={BOTS_SET:"g:0",BOT_COUNT_INVALID:"g:1"},Ae="modulepreload",Pe=function(n){return"/"+n},F={},Te=function(e,t,r){let a=Promise.resolve();if(t&&t.length>0){let _=function(l){return Promise.all(l.map(h=>Promise.resolve(h).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),c=o?.nonce||o?.getAttribute("nonce");a=_(t.map(l=>{if(l=Pe(l),l in F)return;F[l]=!0;const h=l.endsWith(".css"),m=h?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${m}`))return;const g=document.createElement("link");if(g.rel=h?"stylesheet":Ae,h||(g.as="script"),g.crossOrigin="",g.href=l,c&&g.setAttribute("nonce",c),document.head.appendChild(g),h)return new Promise((K,H)=>{g.addEventListener("load",K),g.addEventListener("error",()=>H(new Error(`Unable to preload CSS for ${l}`)))})}))}function i(o){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=o,window.dispatchEvent(c),!c.defaultPrevented)throw o}return a.then(o=>{for(const c of o||[])c.status==="rejected"&&i(c.reason);return e().catch(i)})},Ne=n=>(n??"").endsWith(".js"),Re=n=>import(n),xe=()=>Te(()=>Promise.resolve().then(()=>Le),[]),Ue={id:"snakes",engineApi:4,async createCore(n,{wasmUrl:e}={}){if(Ne(e)){const a=await Re(e);return new a.GameCore(n)}const{default:t,GameCore:r}=await xe();return await t({module_or_path:e}),new r(n)},gameConfig:_e,authSchema:le,chatCommands:[Se,ke,Me,Ce],systemMessages:Ee,createModules:ye,buildClientGameConfig:()=>ue,onCoreEvent(n,e={}){we()?.onCoreEvent(n,e),$()?.onCoreEvent(n,e),ve()?.onCoreEvent(n)}};class N{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,z.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_clientcore_free(e,0)}abi_describe(){let e,t;try{const r=s.clientcore_abi_describe(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}apply_aim(e,t,r,a){s.clientcore_apply_aim(this.__wbg_ptr,e,t,r,a)}apply_input(e,t,r){const a=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),i=d,o=p(t,s.__wbindgen_malloc,s.__wbindgen_realloc),c=d;s.clientcore_apply_input(this.__wbg_ptr,a,i,o,c,r)}debug_json(){let e,t;try{const r=s.clientcore_debug_json(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}decode_frame(e){let t,r;try{const a=v(e,s.__wbindgen_malloc),i=d,o=s.clientcore_decode_frame(this.__wbg_ptr,a,i);return t=o[0],r=o[1],u(o[0],o[1])}finally{s.__wbindgen_free(t,r,1)}}dispatch(e,t){const r=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),a=d,i=v(t,s.__wbindgen_malloc),o=d,c=s.clientcore_dispatch(this.__wbg_ptr,r,a,i,o);var _=k(c[0],c[1]).slice();return s.__wbindgen_free(c[0],c[1]*1,1),_}hot_ptr(){return s.clientcore_hot_ptr(this.__wbg_ptr)>>>0}hot_values(){const e=s.clientcore_hot_values(this.__wbg_ptr);var t=x(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}my_game_id(){return s.clientcore_my_game_id(this.__wbg_ptr)}constructor(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=d,a=s.clientcore_new(t,r);if(a[2])throw f(a[1]);return this.__wbg_ptr=a[0],z.register(this,this.__wbg_ptr,this),this}offset(){return s.clientcore_offset(this.__wbg_ptr)}push_frame(e,t){const r=v(e,s.__wbindgen_malloc),a=d;return s.clientcore_push_frame(this.__wbg_ptr,r,a,t)!==0}reset(){s.clientcore_reset(this.__wbg_ptr)}resync(){s.clientcore_resync(this.__wbg_ptr)}sample(e){return s.clientcore_sample(this.__wbg_ptr,e)>>>0}set_active(e){s.clientcore_set_active(this.__wbg_ptr,e)}set_map(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=d,a=s.clientcore_set_map(this.__wbg_ptr,t,r);if(a[1])throw f(a[0])}set_model(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=d;s.clientcore_set_model(this.__wbg_ptr,t,r)}sync_panel(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=d;s.clientcore_sync_panel(this.__wbg_ptr,t,r)}take_divergence(){let e,t;try{const r=s.clientcore_take_divergence(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}take_frames(){let e,t;try{const r=s.clientcore_take_frames(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(N.prototype[Symbol.dispose]=N.prototype.free);class R{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,B.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_gamecore_free(e,0)}abi_describe(){let e,t;try{const r=s.gamecore_abi_describe(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}alive_players(){const e=s.gamecore_alive_players(this.__wbg_ptr);var t=x(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}apply_aim(e,t,r,a,i){s.gamecore_apply_aim(this.__wbg_ptr,e,t,r,a,i)}apply_input(e,t,r,a){const i=p(r,s.__wbindgen_malloc,s.__wbindgen_realloc),o=d,c=p(a,s.__wbindgen_malloc,s.__wbindgen_realloc),_=d;s.gamecore_apply_input(this.__wbg_ptr,e,t,i,o,c,_)}body_has_events(){return s.gamecore_body_has_events(this.__wbg_ptr)!==0}clear(){s.gamecore_clear(this.__wbg_ptr)}debug_json(){let e,t;try{const r=s.gamecore_debug_json(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}deserialize_state(e){const t=v(e,s.__wbindgen_malloc),r=d,a=s.gamecore_deserialize_state(this.__wbg_ptr,t,r);if(a[1])throw f(a[0])}dispatch(e,t){const r=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),a=d,i=v(t,s.__wbindgen_malloc),o=d,c=s.gamecore_dispatch(this.__wbg_ptr,r,a,i,o);var _=k(c[0],c[1]).slice();return s.__wbindgen_free(c[0],c[1]*1,1),_}frame_bytes(){const e=s.gamecore_frame_bytes(this.__wbg_ptr);var t=k(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}frame_ptr(){return s.gamecore_frame_ptr(this.__wbg_ptr)>>>0}is_alive(e){return s.gamecore_is_alive(this.__wbg_ptr,e)!==0}last_input_seq(e){return s.gamecore_last_input_seq(this.__wbg_ptr,e)>>>0}load_map(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=d,a=s.gamecore_load_map(this.__wbg_ptr,t,r);if(a[1])throw f(a[0])}map_info(){let e,t;try{const r=s.gamecore_map_info(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}constructor(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=d,a=s.gamecore_new(t,r);if(a[2])throw f(a[1]);return this.__wbg_ptr=a[0],B.register(this,this.__wbg_ptr,this),this}pack_body(){const e=s.gamecore_pack_body(this.__wbg_ptr);if(e[1])throw f(e[0])}pack_frame(e,t,r,a,i,o,c,_){var l=De(c)?0:p(c,s.__wbindgen_malloc,s.__wbindgen_realloc),h=d;return s.gamecore_pack_frame(this.__wbg_ptr,e,t,r,a,i,o,l,h,_)>>>0}players_data(){let e,t;try{const r=s.gamecore_players_data(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}position_of(e){const t=s.gamecore_position_of(this.__wbg_ptr,e);var r=x(t[0],t[1]).slice();return s.__wbindgen_free(t[0],t[1]*4,4),r}remove_actor(e){s.gamecore_remove_actor(this.__wbg_ptr,e)}remove_players_and_shots(){let e,t;try{const r=s.gamecore_remove_players_and_shots(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}remove_scripted_actor(e){s.gamecore_remove_scripted_actor(this.__wbg_ptr,e)}reset_actor(e,t,r,a,i){s.gamecore_reset_actor(this.__wbg_ptr,e,t,r,a,i)}reset_all_vitals(){s.gamecore_reset_all_vitals(this.__wbg_ptr)}serialize_state(){const e=s.gamecore_serialize_state(this.__wbg_ptr);if(e[3])throw f(e[2]);var t=k(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}spawn_actor(e,t,r,a,i,o){const c=p(t,s.__wbindgen_malloc,s.__wbindgen_realloc),_=d,l=s.gamecore_spawn_actor(this.__wbg_ptr,e,c,_,r,a,i,o);if(l[1])throw f(l[0])}spawn_scripted_actor(e,t,r,a,i,o){const c=p(t,s.__wbindgen_malloc,s.__wbindgen_realloc),_=d,l=s.gamecore_spawn_scripted_actor(this.__wbg_ptr,e,c,_,r,a,i,o);if(l[1])throw f(l[0])}step(e){s.gamecore_step(this.__wbg_ptr,e)}take_events(){let e,t;try{const r=s.gamecore_take_events(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(R.prototype[Symbol.dispose]=R.prototype.free);function q(){return{__proto__:null,"./vimp_snakes_core_bg.js":{__proto__:null,__wbg_Error_408e67f47ca7b58b:function(e,t){return Error(u(e,t))},__wbg___wbindgen_throw_bb96b2010945f0bc:function(e,t){throw new Error(u(e,t))},__wbindgen_init_externref_table:function(){const e=s.__wbindgen_externrefs,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)}}}}const z=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>s.__wbg_clientcore_free(n,1)),B=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>s.__wbg_gamecore_free(n,1));function x(n,e){return n=n>>>0,Ie().subarray(n/4,n/4+e)}function k(n,e){return n=n>>>0,b().subarray(n/1,n/1+e)}let y=null;function Ie(){return(y===null||y.byteLength===0)&&(y=new Float32Array(s.memory.buffer)),y}function u(n,e){return Fe(n>>>0,e)}let w=null;function b(){return(w===null||w.byteLength===0)&&(w=new Uint8Array(s.memory.buffer)),w}function De(n){return n==null}function v(n,e){const t=e(n.length*1,1)>>>0;return b().set(n,t/1),d=n.length,t}function p(n,e,t){if(t===void 0){const c=S.encode(n),_=e(c.length,1)>>>0;return b().subarray(_,_+c.length).set(c),d=c.length,_}let r=n.length,a=e(r,1)>>>0;const i=b();let o=0;for(;o<r;o++){const c=n.charCodeAt(o);if(c>127)break;i[a+o]=c}if(o!==r){o!==0&&(n=n.slice(o)),a=t(a,r,r=o+n.length*3,1)>>>0;const c=b().subarray(a+o,a+r),_=S.encodeInto(n,c);o+=_.written,a=t(a,r,o,1)>>>0}return d=o,a}function f(n){const e=s.__wbindgen_externrefs.get(n);return s.__externref_table_dealloc(n),e}let M=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});M.decode();const Oe=2146435072;let E=0;function Fe(n,e){return E+=e,E>=Oe&&(M=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),M.decode(),E=e),M.decode(b().subarray(n,n+e))}const S=new TextEncoder;"encodeInto"in S||(S.encodeInto=function(n,e){const t=S.encode(n);return e.set(t),{read:n.length,written:t.length}});let d=0,s;function Y(n,e){return s=n.exports,y=null,w=null,s.__wbindgen_start(),s}async function ze(n,e){if(typeof Response=="function"&&n instanceof Response){if(!n.ok)throw new Error(`failed to fetch Wasm: ${n.status} ${n.statusText} fetching '${n.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(n,e)}catch(a){if(t(n.type)&&n.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",a);else throw a}const r=await n.arrayBuffer();return await WebAssembly.instantiate(r,e)}else{const r=await WebAssembly.instantiate(n,e);return r instanceof WebAssembly.Instance?{instance:r,module:n}:r}function t(r){switch(r){case"basic":case"cors":case"default":return!0}return!1}}function Be(n){if(s!==void 0)return s;n!==void 0&&(Object.getPrototypeOf(n)===Object.prototype?{module:n}=n:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=q();n instanceof WebAssembly.Module||(n=new WebAssembly.Module(n));const t=new WebAssembly.Instance(n,e);return Y(t)}async function We(n){if(s!==void 0)return s;n!==void 0&&(Object.getPrototypeOf(n)===Object.prototype?{module_or_path:n}=n:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),n===void 0&&(n=new URL("/assets/vimp_snakes_core_bg-DvQ3CEdW.wasm",import.meta.url));const e=q();(typeof n=="string"||typeof Request=="function"&&n instanceof Request||typeof URL=="function"&&n instanceof URL)&&(n=fetch(n));const{instance:t,module:r}=await ze(await n,e);return Y(t)}const Le=Object.freeze(Object.defineProperty({__proto__:null,ClientCore:N,GameCore:R,default:We,initSync:Be},Symbol.toStringTag,{value:"Module"}));export{Ue as default};
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "id": "snakes",
3
3
  "engineApi": 4,
4
- "version": "242aec79889afb25",
4
+ "requires": [
5
+ "accolades"
6
+ ],
7
+ "version": "48c6666bf0a79338",
5
8
  "title": "Snakes",
6
9
  "entries": {
7
- "client": "/games/snakes/client-BMXF1hOR.js",
8
- "host": "/games/snakes/host-5iP1tM2d.js",
9
- "wasm": "/games/snakes/assets/vimp_snakes_core_bg-uUik_EAz.wasm",
10
+ "client": "/games/snakes/client-DOUEds-o.js",
11
+ "host": "/games/snakes/host-DxrwSPbm.js",
12
+ "wasm": "/games/snakes/assets/vimp_snakes_core_bg-DvQ3CEdW.wasm",
10
13
  "wasmNode": "./core-node/vimp_snakes_core.js"
11
14
  },
12
15
  "assetsBase": "/games/snakes/",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vimp-games/snakes",
3
- "version": "0.7.8",
3
+ "version": "0.7.10",
4
4
  "description": "VIMP Snakes — a VIMP game plugin",
5
5
  "author": "lgick",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "globals": "^16.2.0",
47
47
  "happy-dom": "^20.10.6",
48
48
  "pixi.js": "^8.14.0",
49
- "vimp-engine": "^0.22.0",
49
+ "vimp-engine": "^0.23.0",
50
50
  "vite": "^7.1.11",
51
51
  "vitest": "^4.1.9"
52
52
  }
@@ -1,8 +0,0 @@
1
- import{Container as q,Graphics as M,Sprite as ie,Rectangle as ce}from"pixi.js";const de=4,fe='#panel-score:before{content:"★ ";color:#ffd76b}#panel-crystals,#panel-dead,#panel-mode,#panel-time{display:none!important}#stat .stat-leaderboard{padding:12px 0;font:400 16px/1.6 system-ui,sans-serif;color:#e6ecf5}#stat .stat-leaderboard .stat-row{grid-template-columns:3.5em 1fr 5.5em;gap:0 12px;padding:4px 16px;border-radius:6px}#stat .stat-leaderboard .stat-row span:first-child,#stat .stat-leaderboard .stat-row span:last-child{font-variant-numeric:tabular-nums;text-align:right}#stat .stat-leaderboard .stat-row span:first-child{opacity:.6}#stat .stat-leaderboard .stat-row span:last-child{font-weight:700;color:#ffd76b}#stat .stat-leaderboard .stat-row span:nth-child(2){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#stat .stat-leaderboard .is-self{background:#3ab7ff2e;color:#7ef9ff}#snakes-gameover{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#060a149e;font:400 16px/1.5 system-ui,sans-serif;color:#e6ecf5}#snakes-gameover[hidden]{display:none}.snakes-gameover-card{min-width:260px;padding:28px 32px;border:1px solid #39507f;border-radius:12px;background:#141c30;box-shadow:0 18px 48px #00000073;text-align:center}.snakes-gameover-card h2{margin:0 0 4px;font-size:22px;font-weight:600;letter-spacing:.02em}.snakes-gameover-score{margin:0 0 6px;opacity:.75}.snakes-gameover-total{margin:0 0 22px;font-size:15px;letter-spacing:.02em;opacity:.6}.snakes-gameover-total span{font-weight:700;color:#ffd76b}.snakes-gameover-score span{font-size:40px;font-weight:700;color:#7ef9ff;vertical-align:-2px}.snakes-gameover-card button{min-width:120px;padding:10px 20px;border:0;border-radius:8px;background:#3ab7ff;color:#06182a;font:inherit;font-weight:600;cursor:pointer}.snakes-gameover-card button:hover,.snakes-gameover-card button:focus-visible{background:#7ed0ff}',pe={background:856608,floor:1317936,edge:3756159,edgeWidth:10,rings:4,ringColor:1911111},m={innerScale:.62,innerDarken:.55,smoothing:4,eye:16251903,pupil:1054760,boostGlow:16771466,accolade:{diamondEvery:1.6,diamondLong:.9,diamondWide:.55,diamondLighten:.55,crownScale:1.9,crownLift:.44,crownTint:16766827}},he=.5;class ue extends q{constructor(e){super(),this.zIndex=0,!(Array.isArray(e)||e.type==="dynamic")&&this._draw(e)}_draw({map:e,step:t}){const n=e.length,a=(e[0]?.length??0)*t,i=n*t,c=Math.min(a,i)/2,_=a/2,l=i/2,{background:d,floor:f,edge:p,edgeWidth:u,rings:y,ringColor:T}=pe,b=new M;b.rect(-a,-i,a*3,i*3),b.fill(d),b.circle(_,l,c),b.fill(f);for(let E=1;E<y;E+=1)b.circle(_,l,c*E/y),b.stroke({color:T,width:2,alpha:he});b.circle(_,l,c),b.stroke({color:p,width:u,alignment:1}),this.addChild(b)}update(){}destroy(){super.destroy({children:!0})}}const V=[16731469,16752412,16765503,10214972,3065014,3848191,5531903,11623679,16735432,16250871,8250065,16753828],X=[8321535,10146047,13154047,12386267,16771466,16757702],Z=[{value:1,radius:8},{value:3,radius:13},{value:8,radius:20}],ae=16,k=ae*2,C={ANGLE:k,RADIUS:k+1,CRYSTALS:k+2,COLOR:k+3,FLAGS:k+4},ge=1,be=2,we=4,J=.25,ye=.85;function me(r){const e=(Math.sin(r/1e3*we*Math.PI*2)+1)/2;return J+(ye-J)*e}function Q(r){return r!=null}function xe(r,e){const t=i=>Math.round(i+(255-i)*e),n=t(r>>16&255),o=t(r>>8&255),a=t(r&255);return n<<16|o<<8|a}function ve(r,e){const t=Math.round((r>>16&255)*e),n=Math.round((r>>8&255)*e),o=Math.round((r&255)*e);return t<<16|n<<8|o}function Ae(r,e){const t=r.length-1;if(t<1)return r;const n=[r[0]];for(let o=0;o<t;o+=1){const a=r[Math.max(o-1,0)],i=r[o],c=r[o+1],_=r[Math.min(o+2,t)];for(let l=1;l<=e;l+=1){const d=l/e,f=d*d,p=f*d;n.push([.5*(2*i[0]+(-a[0]+c[0])*d+(2*a[0]-5*i[0]+4*c[0]-_[0])*f+(-a[0]+3*i[0]-3*c[0]+_[0])*p),.5*(2*i[1]+(-a[1]+c[1])*d+(2*a[1]-5*i[1]+4*c[1]-_[1])*f+(-a[1]+3*i[1]-3*c[1]+_[1])*p)])}}return n}class Se extends q{constructor(e,t={},n={},o={}){super(),this.zIndex=3,this._sound=n.soundManager,this._localPlayer=n.localPlayer,this._id=o.id??null,this._accolades=n.accolades,this._body=new M,this._head=new M,this.addChild(this._body,this._head),this._crown=t?.crown?this._buildCrown(t.crown):null,this._headAt=[0,0],this._crystals=null,this.update(e)}update(e){const t=e[C.RADIUS]||1,n=e[C.ANGLE]||0,o=e[C.CRYSTALS]||0,a=e[C.FLAGS]||0,i=(a&ge)!==0,c=(a&be)!==0,_=V[(e[C.COLOR]||0)%V.length],l=[];for(let p=0;p<ae;p+=1)l.push([e[p*2]||0,e[p*2+1]||0]);this.alpha=c?me(performance.now()):1;const{daily:d,monthly:f}=this._accolades?.placeOf(this._id)??{};this._drawBody(l,t,_,i,Q(d)),this._drawHead(l[0],n,t,_),this._drawCrown(l[0],n,t,Q(f)),this._crystals!==null&&o>this._crystals&&this._play("pickup",l[0]),this._crystals=o,this._headAt=l[0]}_drawBody(e,t,n,o,a){const i=Ae(e,m.smoothing),c=this._body;c.clear(),c.moveTo(i[0][0],i[0][1]);for(let _=1;_<i.length;_+=1)c.lineTo(i[_][0],i[_][1]);o&&c.stroke({color:m.boostGlow,width:t*2.6,alpha:.22,cap:"round",join:"round"}),c.stroke({color:n,width:t*2,cap:"round",join:"round"}),c.stroke({color:ve(n,m.innerDarken),width:t*2*m.innerScale,alpha:.45,cap:"round",join:"round"}),a&&this._drawDiamonds(i,t,n)}_drawDiamonds(e,t,n){const{diamondEvery:o,diamondLong:a,diamondWide:i,diamondLighten:c}=m.accolade,_=this._body,l=t*o,d=t*a,f=t*i;let p=l*.5;for(let u=1;u<e.length;u+=1){const[y,T]=e[u-1],[b,E]=e[u],j=b-y,G=E-T,v=Math.hypot(j,G);if(v!==0){for(;p<=v;){const H=p/v,P=y+j*H,I=T+G*H,W=j/v,N=G/v;_.moveTo(P+W*d,I+N*d),_.lineTo(P-N*f,I+W*f),_.lineTo(P-W*d,I-N*d),_.lineTo(P+N*f,I-W*f),_.fill(xe(n,c)),p+=l}p-=v}}}_drawHead([e,t],n,o,a){const i=this._head;i.clear(),i.circle(e,t,o),i.fill(a);const c=Math.cos(n),_=Math.sin(n),l=o*.5,d=o*.42,f=o*.32;for(const p of[-1,1]){const u=e+c*d-_*l*p,y=t+_*d+c*l*p;i.circle(u,y,f),i.fill(m.eye),i.circle(u+c*f*.35,y+_*f*.35,f*.5),i.fill(m.pupil)}}_buildCrown(e){const t=new ie(e);return t.anchor.set(.5,1),t.tint=m.accolade.crownTint,t.visible=!1,this.addChild(t),t}_drawCrown([e,t],n,o,a){if(!this._crown||(this._crown.visible=a,!a))return;const{crownScale:i,crownLift:c}=m.accolade,_=o*i;this._crown.scale.set(_/this._crown.texture.width),this._crown.rotation=n+Math.PI/2,this._crown.x=e+Math.cos(n)*o*c,this._crown.y=t+Math.sin(n)*o*c}_isLocal(){return this._localPlayer?this._localPlayer.is(this._id):(this._warned||(this._warned=!0,console.error("[snakes] the `localPlayer` service is missing: engine too old, game cues stay silent")),!1)}_play(e,[t,n]){!this._sound||!this._isLocal()||this._sound.registerSound(e,{position:{x:t,y:n}})}destroy(){this._play("death",this._headAt),super.destroy({children:!0})}}const z={X:0,Y:1,TIER:2,COLOR:3},Ee=32;class ke extends q{constructor(e,t){super(),this.zIndex=2,this._sprite=new ie(t.crystalGem),this._sprite.anchor.set(.5),this.addChild(this._sprite),this.update(e)}update(e){this.x=e[z.X]||0,this.y=e[z.Y]||0;const t=Z[e[z.TIER]||0]??Z[0];this._sprite.scale.set(t.radius/Ee),this._sprite.tint=X[(e[z.COLOR]||0)%X.length],this._sprite.rotation=(this.x+this.y)%360*(Math.PI/180)}destroy(){super.destroy({children:!0})}}const Ce={Arena:ue,Snake:Se,Crystal:ke};function Le(r,e){const{radius:t,facets:n}=r,o=t*2,a=new M,i=(d,f,p=0)=>{const u=(f+p)/n*Math.PI*2-Math.PI/2;return[t+Math.cos(u)*d,t+Math.sin(u)*d]},c=[];for(let d=0;d<n;d+=1)c.push(i(t*.94,d));a.poly(c.flat()),a.fill({color:16777215,alpha:.85});const _=[];for(let d=0;d<n;d+=1)_.push(i(t*.5,d,.5));a.poly(_.flat()),a.fill({color:16777215,alpha:1});const l=e.generateTexture({target:a,frame:new ce(0,0,o,o)});return a.destroy(!0),l}function Re(r,e){const{size:t,points:n}=r,o=new M,a=t*.26,i=t*.08,c=t-a,_=t/n,l=[0,c];for(let f=0;f<n;f+=1){const p=(n-1)/2,u=Math.abs(f-p)/(p||1)*t*.18;l.push(f*_,i+u),l.push((f+.5)*_,c*.55)}l.push(t,i+t*.18,t,c),o.poly(l),o.fill({color:16777215,alpha:.92}),o.rect(0,c,t,a),o.fill({color:16777215,alpha:1});const d=e.generateTexture({target:o,frame:new ce(0,0,t,t)});return o.destroy(!0),d}const Oe={crystalGem:Le,crown:Re},A="snakes-gameover",Me=82,ee="d",te="s";function Te(r,e){const t=new KeyboardEvent(r,{keyCode:e,bubbles:!0});t.keyCode!==e&&(Object.defineProperty(t,"keyCode",{value:e}),Object.defineProperty(t,"which",{value:e})),window.dispatchEvent(t)}function Pe(r){const e={};for(const t of r??[]){const n=String(t).indexOf(":");n>0&&(e[t.slice(0,n)]=Number(t.slice(n+1)))}return e}class Ie{constructor(){this._root=null,this._crystals=null,this._total=null,this._visible=!1,this._lastScore=0}mount(){if(this._root||typeof document>"u")return;const e=document.createElement("div");e.id=A,e.hidden=!0,e.innerHTML=`
2
- <div class="${A}-card">
3
- <h2>You crashed</h2>
4
- <p class="${A}-score"><span>0</span> crystals</p>
5
- <p class="${A}-total">Total score: <span>0</span></p>
6
- <button type="button">OK</button>
7
- </div>
8
- `,this._crystals=e.querySelector(`.${A}-score span`),this._total=e.querySelector(`.${A}-total span`),e.querySelector("button").addEventListener("click",()=>this._respawn()),document.body.appendChild(e),this._root=e}onPanel(e){if(!this._root)return;const t=Pe(e);if(te in t&&(this._lastScore=t[te]),!(ee in t))return;const n=t[ee];n>0?this._show(n-1):this._hide()}reset(){this._hide(),this._lastScore=0}_show(e){this._visible||(this._visible=!0,this._crystals.textContent=String(e),this._total.textContent=String(this._lastScore),this._root.hidden=!1)}_hide(){this._visible&&(this._visible=!1,this._root.hidden=!0)}_respawn(){this._hide();for(const e of["keydown","keyup"])Te(e,Me)}}const We="modulepreload",Ne=function(r){return"/"+r},ne={},ze=function(e,t,n){let o=Promise.resolve();if(t&&t.length>0){let _=function(l){return Promise.all(l.map(d=>Promise.resolve(d).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),c=i?.nonce||i?.getAttribute("nonce");o=_(t.map(l=>{if(l=Ne(l),l in ne)return;ne[l]=!0;const d=l.endsWith(".css"),f=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${f}`))return;const p=document.createElement("link");if(p.rel=d?"stylesheet":We,d||(p.as="script"),p.crossOrigin="",p.href=l,c&&p.setAttribute("nonce",c),document.head.appendChild(p),d)return new Promise((u,y)=>{p.addEventListener("load",u),p.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${l}`)))})}))}function a(i){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=i,window.dispatchEvent(c),!c.defaultPrevented)throw i}return o.then(i=>{for(const c of i||[])c.status==="rejected"&&a(c.reason);return e().catch(a)})},Fe=r=>(r??"").endsWith(".js"),je=r=>import(r),Ge=()=>ze(()=>Promise.resolve().then(()=>He),[]),D=new Ie,Xe={id:"snakes",engineApi:de,async createClientCore(r,{wasmUrl:e}={}){if(Fe(e)){const a=await je(e);return{core:new a.ClientCore(r),memory:null}}const{default:t,ClientCore:n}=await Ge(),o=await t({module_or_path:e});return{core:new n(r),memory:o.memory}},parts:Ce,bakers:Oe,styles:fe,hooks:{onAuth(r,e){r.set_model(e.model),D.mount(),D.reset()},onPanel(r,e){r.sync_panel(JSON.stringify(e)),D.onPanel(e)},onLocalAction(){return null}}};class Y{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,re.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_clientcore_free(e,0)}apply_aim(e,t,n,o){s.clientcore_apply_aim(this.__wbg_ptr,e,t,n,o)}apply_input(e,t,n){const o=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),a=h,i=g(t,s.__wbindgen_malloc,s.__wbindgen_realloc),c=h;s.clientcore_apply_input(this.__wbg_ptr,o,a,i,c,n)}debug_json(){let e,t;try{const n=s.clientcore_debug_json(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}decode_frame(e){let t,n;try{const o=K(e,s.__wbindgen_malloc),a=h,i=s.clientcore_decode_frame(this.__wbg_ptr,o,a);return t=i[0],n=i[1],w(i[0],i[1])}finally{s.__wbindgen_free(t,n,1)}}hot_ptr(){return s.clientcore_hot_ptr(this.__wbg_ptr)>>>0}hot_values(){const e=s.clientcore_hot_values(this.__wbg_ptr);var t=B(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}my_game_id(){return s.clientcore_my_game_id(this.__wbg_ptr)}constructor(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=h,o=s.clientcore_new(t,n);if(o[2])throw x(o[1]);return this.__wbg_ptr=o[0],re.register(this,this.__wbg_ptr,this),this}offset(){return s.clientcore_offset(this.__wbg_ptr)}push_frame(e,t){const n=K(e,s.__wbindgen_malloc),o=h;return s.clientcore_push_frame(this.__wbg_ptr,n,o,t)!==0}reset(){s.clientcore_reset(this.__wbg_ptr)}resync(){s.clientcore_resync(this.__wbg_ptr)}sample(e){return s.clientcore_sample(this.__wbg_ptr,e)>>>0}set_active(e){s.clientcore_set_active(this.__wbg_ptr,e)}set_map(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=h,o=s.clientcore_set_map(this.__wbg_ptr,t,n);if(o[1])throw x(o[0])}set_model(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=h;s.clientcore_set_model(this.__wbg_ptr,t,n)}sync_panel(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=h;s.clientcore_sync_panel(this.__wbg_ptr,t,n)}take_divergence(){let e,t;try{const n=s.clientcore_take_divergence(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}take_frames(){let e,t;try{const n=s.clientcore_take_frames(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(Y.prototype[Symbol.dispose]=Y.prototype.free);class ${__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,se.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_gamecore_free(e,0)}alive_players(){const e=s.gamecore_alive_players(this.__wbg_ptr);var t=B(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}apply_aim(e,t,n,o,a){s.gamecore_apply_aim(this.__wbg_ptr,e,t,n,o,a)}apply_input(e,t,n,o){const a=g(n,s.__wbindgen_malloc,s.__wbindgen_realloc),i=h,c=g(o,s.__wbindgen_malloc,s.__wbindgen_realloc),_=h;s.gamecore_apply_input(this.__wbg_ptr,e,t,a,i,c,_)}body_has_events(){return s.gamecore_body_has_events(this.__wbg_ptr)!==0}clear(){s.gamecore_clear(this.__wbg_ptr)}debug_json(){let e,t;try{const n=s.gamecore_debug_json(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}deserialize_state(e){const t=K(e,s.__wbindgen_malloc),n=h,o=s.gamecore_deserialize_state(this.__wbg_ptr,t,n);if(o[1])throw x(o[0])}frame_bytes(){const e=s.gamecore_frame_bytes(this.__wbg_ptr);var t=oe(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}frame_ptr(){return s.gamecore_frame_ptr(this.__wbg_ptr)>>>0}is_alive(e){return s.gamecore_is_alive(this.__wbg_ptr,e)!==0}last_input_seq(e){return s.gamecore_last_input_seq(this.__wbg_ptr,e)>>>0}load_map(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=h,o=s.gamecore_load_map(this.__wbg_ptr,t,n);if(o[1])throw x(o[0])}map_info(){let e,t;try{const n=s.gamecore_map_info(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}constructor(e){const t=g(e,s.__wbindgen_malloc,s.__wbindgen_realloc),n=h,o=s.gamecore_new(t,n);if(o[2])throw x(o[1]);return this.__wbg_ptr=o[0],se.register(this,this.__wbg_ptr,this),this}pack_body(){const e=s.gamecore_pack_body(this.__wbg_ptr);if(e[1])throw x(e[0])}pack_frame(e,t,n,o,a,i,c,_){var l=Ue(c)?0:g(c,s.__wbindgen_malloc,s.__wbindgen_realloc),d=h;return s.gamecore_pack_frame(this.__wbg_ptr,e,t,n,o,a,i,l,d,_)>>>0}players_data(){let e,t;try{const n=s.gamecore_players_data(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}position_of(e){const t=s.gamecore_position_of(this.__wbg_ptr,e);var n=B(t[0],t[1]).slice();return s.__wbindgen_free(t[0],t[1]*4,4),n}remove_actor(e){s.gamecore_remove_actor(this.__wbg_ptr,e)}remove_players_and_shots(){let e,t;try{const n=s.gamecore_remove_players_and_shots(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}remove_scripted_actor(e){s.gamecore_remove_scripted_actor(this.__wbg_ptr,e)}reset_actor(e,t,n,o,a){s.gamecore_reset_actor(this.__wbg_ptr,e,t,n,o,a)}reset_all_vitals(){s.gamecore_reset_all_vitals(this.__wbg_ptr)}serialize_state(){const e=s.gamecore_serialize_state(this.__wbg_ptr);if(e[3])throw x(e[2]);var t=oe(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}spawn_actor(e,t,n,o,a,i){const c=g(t,s.__wbindgen_malloc,s.__wbindgen_realloc),_=h,l=s.gamecore_spawn_actor(this.__wbg_ptr,e,c,_,n,o,a,i);if(l[1])throw x(l[0])}spawn_scripted_actor(e,t,n,o,a,i){const c=g(t,s.__wbindgen_malloc,s.__wbindgen_realloc),_=h,l=s.gamecore_spawn_scripted_actor(this.__wbg_ptr,e,c,_,n,o,a,i);if(l[1])throw x(l[0])}step(e){s.gamecore_step(this.__wbg_ptr,e)}take_events(){let e,t;try{const n=s.gamecore_take_events(this.__wbg_ptr);return e=n[0],t=n[1],w(n[0],n[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&($.prototype[Symbol.dispose]=$.prototype.free);function _e(){return{__proto__:null,"./vimp_snakes_core_bg.js":{__proto__:null,__wbg_Error_408e67f47ca7b58b:function(e,t){return Error(w(e,t))},__wbg___wbindgen_throw_bb96b2010945f0bc:function(e,t){throw new Error(w(e,t))},__wbindgen_init_externref_table:function(){const e=s.__wbindgen_externrefs,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)}}}}const re=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(r=>s.__wbg_clientcore_free(r,1)),se=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(r=>s.__wbg_gamecore_free(r,1));function B(r,e){return r=r>>>0,De().subarray(r/4,r/4+e)}function oe(r,e){return r=r>>>0,S().subarray(r/1,r/1+e)}let L=null;function De(){return(L===null||L.byteLength===0)&&(L=new Float32Array(s.memory.buffer)),L}function w(r,e){return $e(r>>>0,e)}let R=null;function S(){return(R===null||R.byteLength===0)&&(R=new Uint8Array(s.memory.buffer)),R}function Ue(r){return r==null}function K(r,e){const t=e(r.length*1,1)>>>0;return S().set(r,t/1),h=r.length,t}function g(r,e,t){if(t===void 0){const c=O.encode(r),_=e(c.length,1)>>>0;return S().subarray(_,_+c.length).set(c),h=c.length,_}let n=r.length,o=e(n,1)>>>0;const a=S();let i=0;for(;i<n;i++){const c=r.charCodeAt(i);if(c>127)break;a[o+i]=c}if(i!==n){i!==0&&(r=r.slice(i)),o=t(o,n,n=i+r.length*3,1)>>>0;const c=S().subarray(o+i,o+n),_=O.encodeInto(r,c);i+=_.written,o=t(o,n,i,1)>>>0}return h=i,o}function x(r){const e=s.__wbindgen_externrefs.get(r);return s.__externref_table_dealloc(r),e}let F=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});F.decode();const Ye=2146435072;let U=0;function $e(r,e){return U+=e,U>=Ye&&(F=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),F.decode(),U=e),F.decode(S().subarray(r,r+e))}const O=new TextEncoder;"encodeInto"in O||(O.encodeInto=function(r,e){const t=O.encode(r);return e.set(t),{read:r.length,written:t.length}});let h=0,s;function le(r,e){return s=r.exports,L=null,R=null,s.__wbindgen_start(),s}async function Be(r,e){if(typeof Response=="function"&&r instanceof Response){if(!r.ok)throw new Error(`failed to fetch Wasm: ${r.status} ${r.statusText} fetching '${r.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(r,e)}catch(o){if(t(r.type)&&r.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",o);else throw o}const n=await r.arrayBuffer();return await WebAssembly.instantiate(n,e)}else{const n=await WebAssembly.instantiate(r,e);return n instanceof WebAssembly.Instance?{instance:n,module:r}:n}function t(n){switch(n){case"basic":case"cors":case"default":return!0}return!1}}function Ke(r){if(s!==void 0)return s;r!==void 0&&(Object.getPrototypeOf(r)===Object.prototype?{module:r}=r:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=_e();r instanceof WebAssembly.Module||(r=new WebAssembly.Module(r));const t=new WebAssembly.Instance(r,e);return le(t)}async function qe(r){if(s!==void 0)return s;r!==void 0&&(Object.getPrototypeOf(r)===Object.prototype?{module_or_path:r}=r:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),r===void 0&&(r=new URL("/assets/vimp_snakes_core_bg-uUik_EAz.wasm",import.meta.url));const e=_e();(typeof r=="string"||typeof Request=="function"&&r instanceof Request||typeof URL=="function"&&r instanceof URL)&&(r=fetch(r));const{instance:t,module:n}=await Be(await r,e);return le(t)}const He=Object.freeze(Object.defineProperty({__proto__:null,ClientCore:Y,GameCore:$,default:qe,initSync:Ke},Symbol.toStringTag,{value:"Module"}));export{Xe as default};
@@ -1 +0,0 @@
1
- const X=Array.from({length:16},(n,e)=>[{name:`p${e}x`,ty:"f32",interp:"lerp"},{name:`p${e}y`,ty:"f32",interp:"lerp"}]).flat(),Z={s1:{id:1,kind:"indexed8",class:"hot",fields:[...X,{name:"angle",ty:"f32",interp:"lerpAngle"},{name:"radius",ty:"f32",interp:"lerp"},{name:"crystals",ty:"u16"},{name:"color",ty:"u8"},{name:"boost",ty:"u8"}]},cr:{id:2,kind:"indexed32",class:"event",fields:[{name:"x",ty:"f32"},{name:"y",ty:"f32"},{name:"tier",ty:"u8"},{name:"color",ty:"u8"}]},c1:{id:3,kind:"indexedNoNull8",class:"hot",fields:[{name:"x",ty:"f32",interp:"lerp"},{name:"y",ty:"f32",interp:"lerp"},{name:"angle",ty:"f32",interp:"lerpAngle"}]}},x=[16731469,16752412,16765503,10214972,3065014,3848191,5531903,11623679,16735432,16250871,8250065,16753828],Q=n=>`#${x[n%x.length].toString(16).padStart(6,"0")}`,J=[{value:1,radius:8},{value:3,radius:13},{value:8,radius:20}],A={s1:{baseSpeed:260,boostFactor:1.9,turnSpeed:3.4,turnSpeedFalloff:.18,turnSpeedMin:1.4,baseRadius:14,radiusGain:1.6,baseLength:150,lengthPerCrystal:9,pointSpacing:6,boostDrainPerSecond:6,boostMinCrystals:2,world:{maxCrystals:60,spawnInterval:.35,tierWeights:[70,25,5],tiers:J,dropRatio:.8,edgeMargin:60,startCrystals:0,spawnGraceSeconds:2}}},ee={},L=128,I=1,te=20,D=8,C=4,k=64,re=Math.PI*(3-Math.sqrt(5)),ne=.72,se=25;function E(n){const e=Math.ceil(Math.max(n,0)/C)*C,t=Math.max(e,D);return Math.round(te*Math.sqrt(t/D))}const W=Math.log2(k);if(!Number.isInteger(W))throw new Error(`RESPAWN_COUNT must be a power of two (the order is bit-reversed), got ${k}`);function ae(n){let e=0;for(let t=0;t<W;t+=1)e=e<<1|n>>t&1;return e}function ie(n){const e=n*L/2,t=e;return Array.from({length:k},(r,s)=>{const i=ae(s),o=e*ne*Math.sqrt((i+.5)/k),c=i*re,l=t+Math.cos(c)*o,_=t+Math.sin(c)*o,h=(s*.6180339887%1*2-1)*se,m=c*180/Math.PI+180+h;return[Math.round(l),Math.round(_),Math.round((m%360+360)%360)]})}function U(n=0){const e=E(n);return{setId:"c1",scale:1,step:L,physicsStatic:[],physicsDynamic:[],layers:{1:[I]},map:Array.from({length:e},()=>Array.from({length:e},()=>I)),respawns:{players:ie(e)}}}const oe=U(0),ce={arena:oe},_e={title:"Snakes",parts:{models:A,weapons:ee,friendlyFire:!1},snapshot:Z,soundCues:{roundStart:null,victory:null,defeat:null,frag:null,death:null},maps:ce,currentMap:"arena",mapScale:1,mapSetId:"c1",mapsInVote:1,timers:{timeStep:1e3/120,networkSendRate:4,roundTime:36e5,mapTime:36e5,roomTimeMin:1e4,roomTimeMax:36e5,voteTime:1e4,timeBlockedVote:3e4,teamChangeGracePeriod:1e4,roundRestartDelay:5e3,mapChangeDelay:2e3,rttPingInterval:3e3,idleCheckInterval:3e4},playerState:{defaultState:{best:0,eaten:0}},noSpectators:!0,endlessRound:!0,statMode:"leaderboard",teams:{players:1},scripted:{namePrefix:"Snake",defaultModel:"s1"},playerKeys:{left:{key:1},right:{key:2},boost:{key:4},respawn:{key:8,type:1}},panel:{fields:{crystals:{key:"c",value:0},score:{key:"s",value:0},dead:{key:"d",value:0}},activeKey:"wa"},stat:{name:{key:0,bodyMethod:"=",headSync:!0,headMethod:"#"},status:{key:1,bodyMethod:"=",bodyValue:"",headValue:""},score:{key:2,bodyMethod:"=",bodyValue:0,headMethod:"+",headValue:0},latency:{key:3,bodyMethod:"="}},roomDefaults:{maxPlayers:32},roomForm:[{name:"maxPlayers",control:"text",label:"Max players",numeric:!0},{name:"map",control:"select",label:"Map",source:"maps"}]},le={elems:{authId:"auth",fieldsId:"auth-fields",errorId:"auth-error",enterId:"auth-enter",titleId:"auth-title",informsId:"auth-informs"},texts:{title:"Snakes",sections:[{heading:"How to play",lines:[{keys:"a, d",text:"turn"},{keys:"w",text:"boost (burns crystals)"},{keys:"r",text:"respawn after a crash"},{separator:!0},{keys:"",text:"eat crystals to grow"},{keys:"",text:"the edge and other snakes kill you"},{keys:"",text:"your own tail does not"},{separator:!0},{keys:"c",text:"chat"},{keys:"<Tab>",text:"stats",last:!0}]}]},params:[{name:"model",value:"s1",options:{control:"select",label:"Snake",options:Object.keys(A),validator:"isValidModel",storage:"model"}}],validators:{isValidModel:n=>n in A}},pe={pickup:{file:"shot",priority:80,volume:.35},death:{file:"death",priority:150,volume:.5}},de={codecList:["webm","mp3"],sounds:pe},ue={parts:{gameSets:{s1:["Snake"],cr:["Crystal"],c1:["Arena"]},entitiesOnCanvas:{Arena:"vimp",Snake:"vimp",Crystal:"vimp"},bakedAssets:{vimp:[{name:"crystalGem",component:"Crystal",params:{radius:32,facets:6}},{name:"crown",component:"Snake",params:{size:64,points:3}}]},componentDependencies:{soundManager:["Snake"],localPlayer:["Snake"],accolades:["Snake"]},sounds:de},initIdList:["vimp","panel","chat"],modules:{canvasManager:{canvases:{vimp:{width:960,height:600,aspectRatio:"16:10",baseScale:"1:1",dynamicCamera:!0,shakeCamera:!1}}},controls:{modes:{77:""},keySetList:[{78:"nextPlayer",80:"prevPlayer"},{65:"left",68:"right",87:"boost",82:"respawn"}],pointer:{keySets:[1],doubleTapMs:300,doubleTapPx:40,sendIntervalMs:50}},chat:{params:{messages:{s:["The arena is full. You will join as soon as a place frees up","You are already in the arena","You are in the arena","You are watching the arena","{0} crashed into {1}","{0} joined the game","{0} left the game"],v:["A vote has been created","Voting has started","Your vote has been accepted","Voting is temporarily unavailable","Vote passed","Vote failed"],m:["Current map: {0}","Next map: {0}"],c:["Command not found","Your place today: {0} of {1} ({2} points)"],n:["Invalid name","{0} changed name to {1}"],g:["Bot snakes in the arena: {0}","Invalid bot count"]}}},panel:{keys:{s:"score",c:"crystals",d:"dead",wa:"mode",t:"time"},fields:[{name:"score",elem:"panel-score",type:"value"},{name:"crystals",elem:"panel-crystals",type:"value"},{name:"dead",elem:"panel-dead",type:"value"},{name:"mode",elem:"panel-mode",type:"weapon"},{name:"time",elem:"panel-time",type:"time"}]},stat:{params:{mode:"leaderboard",period:"day",limit:10,columns:["#","snake","score"]}}},gameInform:{list:["{0} WINS!","SLITHER!","GAME OVER!"]}};class he{constructor({participants:e,coreAdapter:t,socketManager:r},s){this._participants=e,this._coreAdapter=t,this._socketManager=r,this._scriptedManager=s,this._vimp=null,this._population=null,this._size=null,this._mapData=null,this._delivered=new Map}onCoreEvent(e,t={}){t.vimp&&(this._vimp=t.vimp),!(!e||e.type!=="population")&&this._apply(Number(e.count)||0)}_apply(e){const t=this._sizeFor(e);if(t!==this._size){this._size=t,this._population=e;const r=U(e);this._coreAdapter.createMap(r),this._scriptedManager?.createMap(r),this._vimp?.overrideMapData?.(r),this._mapData=r,this._delivered.clear()}this._broadcast()}_sizeFor(e){if(this._size===null)return E(e);const t=E(e);return t>this._size||e<=this._population-C?t:this._size}_broadcast(){if(!this._mapData)return;const e=this._participants.getHumans();for(const t of e)!t.isReady||this._delivered.get(t.gameId)===this._size||(this._delivered.set(t.gameId,this._size),this._socketManager.sendMap(t.socketId,this._mapData));if(this._delivered.size>e.length){const t=new Set(e.map(r=>r.gameId));for(const r of this._delivered.keys())t.has(r)||this._delivered.delete(r)}}reapply(){this._mapData&&(this._vimp?.overrideMapData?.(this._mapData),this._coreAdapter.createMap(this._mapData),this._scriptedManager?.createMap(this._mapData),this._broadcast())}get mapData(){return this._mapData??null}}class fe{constructor({participants:e}){this._participants=e}onCoreEvent(e){if(!e||e.type!=="spawn")return;const t=Number(e.color);!Number.isFinite(t)||t<0||this._participants?.setChatColor?.(String(e.id),Q(t))}}class me{constructor({participants:e,coreAdapter:t,panel:r,stat:s,scripted:i}){this._participants=e,this._coreAdapter=t,this._panel=r,this._stat=s,this._model=i.defaultModel,this._respawns=null}createMap(e){this._respawns=e.respawns}getCountsPerTeam(){const e={};for(const t of this._participants.getScripted())e[t.team]=(e[t.team]??0)+1;return e}createScripted(e,t=null){if(!this._respawns)return 0;const r=this._participants.getPlayableTeams();let s=0;for(let i=0;i<e&&!this._participants.isFull;i+=1){const o=t??this._pickTeam(r);if(!o||!this._hasRoom(o))break;const c=this._participants.createScripted({team:o,model:this._model}),l=this._participants.get(c);this._stat.addUser(c,l.teamId,{name:l.name,status:"",latency:"BOT"}),this._panel.addUser(c),s+=1}return s}_hasRoom(e){const t=this._respawns[e];return!!(t&&this._participants.getTeamSize(e)<t.length)}_pickTeam(e){return[...e].sort((t,r)=>this._participants.getTeamSize(t)-this._participants.getTeamSize(r)).find(t=>this._hasRoom(t))??null}removeScripted(e=null){const t=this._participants.getScripted();(e?t.filter(s=>s.team===e):t).forEach(s=>this._remove(s.gameId))}removeOneForHuman(e){for(const t of this._participants.getScripted())if(t.team===e)return this._remove(t.gameId),!0;return!1}_remove(e){const t=this._participants.get(e);!t||!t.isScripted||(this._stat.removeUser(e,t.teamId),this._panel.removeUser(e),this._coreAdapter.removePlayer(e),this._participants.remove(e))}}const ge=15;class ye{constructor({participants:e,stat:t}){this._participants=e,this._stat=t,this._totals=new Map}onCoreEvent(e,t={}){if(!e||typeof e!="object")return;const{vimp:r,panel:s}=t,i=String(e.id);switch(e.type){case"crystals":this._onCrystals(i,Number(e.gained)||0,r,s);break;case"burn":this._onBurn(i,Number(e.burned)||0,r,s);break;case"death":this._onDeath(i,e,r,s);break;case"respawn":this._onRespawn(i,r,s);break;case"population":this._publishNewcomers(r,s),r?.flushPlayerData?.();break}}reset(e){this._totals.delete(e)}_onCrystals(e,t,r,s){const i=this._record(e);!i||t<=0||(i.eaten+=t,i.score+=t,this._publish(e,i,r,s))}_onBurn(e,t,r,s){const i=this._record(e);!i||t<=0||(i.score=Math.max(0,i.score-t),this._publish(e,i,r,s))}_onDeath(e,t,r,s){const i=this._record(e);if(!i)return;const o=t.killer===null||t.killer===void 0?null:String(t.killer);if(o!==null&&o!==e){const _=this._record(o);_&&(_.kills+=1,_.score+=ge,this._publish(o,_,r,s))}this._publish(e,i,r,s);const l=r?.isPlayerRatingLoaded?.(e,"day")===!0?r.getPlayerRating?.(e,"day")?.value??0:1/0;r?.addPlayerPoints?.(e,i.score),r?.finishPlayerGame?.(e),this._recordBest(e,i,r),r?.flushPlayerData?.({urgent:i.score>l})}_onRespawn(e,t,r){const s=this._record(e);s&&(s.eaten=0,s.kills=0,s.score=0,s.flushedEaten=0,this._publish(e,s,t,r))}_record(e){const t=this._participants.get(e);if(!t)return null;const r=this._totals.get(e);if(r&&r.participant===t)return r;const s={participant:t,eaten:0,kills:0,score:0,flushedEaten:0,published:!1};return this._totals.set(e,s),s}_publishNewcomers(e,t){for(const r of this._participants.getAll()){const s=r.gameId,i=this._totals.get(s),o=i?.participant===r?i:this._record(s);o&&!o.published&&this._publish(s,o,e,t)}}_publish(e,t,r,s){const{score:i}=t;t.published=!0,this._stat.updateUser(e,t.participant.teamId,{score:i}),s&&s.updateUser(e,"score",i,"set")}_recordBest(e,t,r){if(!r?.getPlayerState)return;const s=r.getPlayerState(e);if(!s)return;const i=t.eaten-t.flushedEaten;t.flushedEaten=t.eaten;const o=Math.max(Number(s.best)||0,t.score),c=(Number(s.eaten)||0)+i;r.setPlayerState(e,{...s,best:o,eaten:c})}}let j=null,V=null,G=null;function be(n){const e=new me(n);return j=new ye(n),V=new he(n,e),G=new fe(n),{scripted:e}}function we(){return j}function $(){return V}function ve(){return G}const Se={name:"/bot",handler(n,e,t){const r=Number(t[0]);if(t[0]===void 0||!Number.isFinite(r)||r<0){n.chat.pushSystemByUser(e,"BOT_COUNT_INVALID");return}const{maxPlayers:s}=n.participants,i=Math.trunc(r),o=s>0?Math.min(i,s):i;n.scripted.removeScripted();const c=o>0?n.scripted.createScripted(o):0;n.chat.pushSystem("BOTS_SET",[c]),c>0&&(n.roundManager.initiateNewRound(),$()?.reapply())}},ke={name:"/name",handler(n,e,t){n.roundManager.changeName(e,t.join(" "))}},Me={name:"/nr",handler(n,e){n.isDevMode?n.roundManager.initiateNewRound():n.chat.pushSystemByUser(e,"COMMANDS_NOT_FOUND")}},Ae={name:"/rank",async handler(n,e){let t=null;try{t=await n.playerDataSync?.refreshPlacement?.(e,"day")}catch{t=n.playerDataSync?.getRating?.(e,"day")??null}const{value:r=0,placement:s=null,total:i=0}=t??{};n.chat.pushSystemByUser(e,"RANK",[s??"—",i,r])}},Ce={BOTS_SET:"g:0",BOT_COUNT_INVALID:"g:1"},Ee="modulepreload",Pe=function(n){return"/"+n},O={},Te=function(e,t,r){let s=Promise.resolve();if(t&&t.length>0){let l=function(_){return Promise.all(_.map(h=>Promise.resolve(h).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),c=o?.nonce||o?.getAttribute("nonce");s=l(t.map(_=>{if(_=Pe(_),_ in O)return;O[_]=!0;const h=_.endsWith(".css"),m=h?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${_}"]${m}`))return;const g=document.createElement("link");if(g.rel=h?"stylesheet":Ee,h||(g.as="script"),g.crossOrigin="",g.href=_,c&&g.setAttribute("nonce",c),document.head.appendChild(g),h)return new Promise((K,H)=>{g.addEventListener("load",K),g.addEventListener("error",()=>H(new Error(`Unable to preload CSS for ${_}`)))})}))}function i(o){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=o,window.dispatchEvent(c),!c.defaultPrevented)throw o}return s.then(o=>{for(const c of o||[])c.status==="rejected"&&i(c.reason);return e().catch(i)})},Ne=n=>(n??"").endsWith(".js"),Re=n=>import(n),xe=()=>Te(()=>Promise.resolve().then(()=>We),[]),Ue={id:"snakes",engineApi:4,async createCore(n,{wasmUrl:e}={}){if(Ne(e)){const s=await Re(e);return new s.GameCore(n)}const{default:t,GameCore:r}=await xe();return await t({module_or_path:e}),new r(n)},gameConfig:_e,authSchema:le,chatCommands:[Se,ke,Me,Ae],systemMessages:Ce,createModules:be,buildClientGameConfig:()=>ue,onCoreEvent(n,e={}){we()?.onCoreEvent(n,e),$()?.onCoreEvent(n,e),ve()?.onCoreEvent(n)}};class P{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,z.unregister(this),e}free(){const e=this.__destroy_into_raw();a.__wbg_clientcore_free(e,0)}apply_aim(e,t,r,s){a.clientcore_apply_aim(this.__wbg_ptr,e,t,r,s)}apply_input(e,t,r){const s=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),i=p,o=d(t,a.__wbindgen_malloc,a.__wbindgen_realloc),c=p;a.clientcore_apply_input(this.__wbg_ptr,s,i,o,c,r)}debug_json(){let e,t;try{const r=a.clientcore_debug_json(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}decode_frame(e){let t,r;try{const s=R(e,a.__wbindgen_malloc),i=p,o=a.clientcore_decode_frame(this.__wbg_ptr,s,i);return t=o[0],r=o[1],u(o[0],o[1])}finally{a.__wbindgen_free(t,r,1)}}hot_ptr(){return a.clientcore_hot_ptr(this.__wbg_ptr)>>>0}hot_values(){const e=a.clientcore_hot_values(this.__wbg_ptr);var t=N(e[0],e[1]).slice();return a.__wbindgen_free(e[0],e[1]*4,4),t}my_game_id(){return a.clientcore_my_game_id(this.__wbg_ptr)}constructor(e){const t=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),r=p,s=a.clientcore_new(t,r);if(s[2])throw f(s[1]);return this.__wbg_ptr=s[0],z.register(this,this.__wbg_ptr,this),this}offset(){return a.clientcore_offset(this.__wbg_ptr)}push_frame(e,t){const r=R(e,a.__wbindgen_malloc),s=p;return a.clientcore_push_frame(this.__wbg_ptr,r,s,t)!==0}reset(){a.clientcore_reset(this.__wbg_ptr)}resync(){a.clientcore_resync(this.__wbg_ptr)}sample(e){return a.clientcore_sample(this.__wbg_ptr,e)>>>0}set_active(e){a.clientcore_set_active(this.__wbg_ptr,e)}set_map(e){const t=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),r=p,s=a.clientcore_set_map(this.__wbg_ptr,t,r);if(s[1])throw f(s[0])}set_model(e){const t=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),r=p;a.clientcore_set_model(this.__wbg_ptr,t,r)}sync_panel(e){const t=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),r=p;a.clientcore_sync_panel(this.__wbg_ptr,t,r)}take_divergence(){let e,t;try{const r=a.clientcore_take_divergence(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}take_frames(){let e,t;try{const r=a.clientcore_take_frames(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(P.prototype[Symbol.dispose]=P.prototype.free);class T{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,F.unregister(this),e}free(){const e=this.__destroy_into_raw();a.__wbg_gamecore_free(e,0)}alive_players(){const e=a.gamecore_alive_players(this.__wbg_ptr);var t=N(e[0],e[1]).slice();return a.__wbindgen_free(e[0],e[1]*4,4),t}apply_aim(e,t,r,s,i){a.gamecore_apply_aim(this.__wbg_ptr,e,t,r,s,i)}apply_input(e,t,r,s){const i=d(r,a.__wbindgen_malloc,a.__wbindgen_realloc),o=p,c=d(s,a.__wbindgen_malloc,a.__wbindgen_realloc),l=p;a.gamecore_apply_input(this.__wbg_ptr,e,t,i,o,c,l)}body_has_events(){return a.gamecore_body_has_events(this.__wbg_ptr)!==0}clear(){a.gamecore_clear(this.__wbg_ptr)}debug_json(){let e,t;try{const r=a.gamecore_debug_json(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}deserialize_state(e){const t=R(e,a.__wbindgen_malloc),r=p,s=a.gamecore_deserialize_state(this.__wbg_ptr,t,r);if(s[1])throw f(s[0])}frame_bytes(){const e=a.gamecore_frame_bytes(this.__wbg_ptr);var t=B(e[0],e[1]).slice();return a.__wbindgen_free(e[0],e[1]*1,1),t}frame_ptr(){return a.gamecore_frame_ptr(this.__wbg_ptr)>>>0}is_alive(e){return a.gamecore_is_alive(this.__wbg_ptr,e)!==0}last_input_seq(e){return a.gamecore_last_input_seq(this.__wbg_ptr,e)>>>0}load_map(e){const t=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),r=p,s=a.gamecore_load_map(this.__wbg_ptr,t,r);if(s[1])throw f(s[0])}map_info(){let e,t;try{const r=a.gamecore_map_info(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}constructor(e){const t=d(e,a.__wbindgen_malloc,a.__wbindgen_realloc),r=p,s=a.gamecore_new(t,r);if(s[2])throw f(s[1]);return this.__wbg_ptr=s[0],F.register(this,this.__wbg_ptr,this),this}pack_body(){const e=a.gamecore_pack_body(this.__wbg_ptr);if(e[1])throw f(e[0])}pack_frame(e,t,r,s,i,o,c,l){var _=De(c)?0:d(c,a.__wbindgen_malloc,a.__wbindgen_realloc),h=p;return a.gamecore_pack_frame(this.__wbg_ptr,e,t,r,s,i,o,_,h,l)>>>0}players_data(){let e,t;try{const r=a.gamecore_players_data(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}position_of(e){const t=a.gamecore_position_of(this.__wbg_ptr,e);var r=N(t[0],t[1]).slice();return a.__wbindgen_free(t[0],t[1]*4,4),r}remove_actor(e){a.gamecore_remove_actor(this.__wbg_ptr,e)}remove_players_and_shots(){let e,t;try{const r=a.gamecore_remove_players_and_shots(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}remove_scripted_actor(e){a.gamecore_remove_scripted_actor(this.__wbg_ptr,e)}reset_actor(e,t,r,s,i){a.gamecore_reset_actor(this.__wbg_ptr,e,t,r,s,i)}reset_all_vitals(){a.gamecore_reset_all_vitals(this.__wbg_ptr)}serialize_state(){const e=a.gamecore_serialize_state(this.__wbg_ptr);if(e[3])throw f(e[2]);var t=B(e[0],e[1]).slice();return a.__wbindgen_free(e[0],e[1]*1,1),t}spawn_actor(e,t,r,s,i,o){const c=d(t,a.__wbindgen_malloc,a.__wbindgen_realloc),l=p,_=a.gamecore_spawn_actor(this.__wbg_ptr,e,c,l,r,s,i,o);if(_[1])throw f(_[0])}spawn_scripted_actor(e,t,r,s,i,o){const c=d(t,a.__wbindgen_malloc,a.__wbindgen_realloc),l=p,_=a.gamecore_spawn_scripted_actor(this.__wbg_ptr,e,c,l,r,s,i,o);if(_[1])throw f(_[0])}step(e){a.gamecore_step(this.__wbg_ptr,e)}take_events(){let e,t;try{const r=a.gamecore_take_events(this.__wbg_ptr);return e=r[0],t=r[1],u(r[0],r[1])}finally{a.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(T.prototype[Symbol.dispose]=T.prototype.free);function q(){return{__proto__:null,"./vimp_snakes_core_bg.js":{__proto__:null,__wbg_Error_408e67f47ca7b58b:function(e,t){return Error(u(e,t))},__wbg___wbindgen_throw_bb96b2010945f0bc:function(e,t){throw new Error(u(e,t))},__wbindgen_init_externref_table:function(){const e=a.__wbindgen_externrefs,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)}}}}const z=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>a.__wbg_clientcore_free(n,1)),F=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>a.__wbg_gamecore_free(n,1));function N(n,e){return n=n>>>0,Ie().subarray(n/4,n/4+e)}function B(n,e){return n=n>>>0,y().subarray(n/1,n/1+e)}let b=null;function Ie(){return(b===null||b.byteLength===0)&&(b=new Float32Array(a.memory.buffer)),b}function u(n,e){return ze(n>>>0,e)}let w=null;function y(){return(w===null||w.byteLength===0)&&(w=new Uint8Array(a.memory.buffer)),w}function De(n){return n==null}function R(n,e){const t=e(n.length*1,1)>>>0;return y().set(n,t/1),p=n.length,t}function d(n,e,t){if(t===void 0){const c=v.encode(n),l=e(c.length,1)>>>0;return y().subarray(l,l+c.length).set(c),p=c.length,l}let r=n.length,s=e(r,1)>>>0;const i=y();let o=0;for(;o<r;o++){const c=n.charCodeAt(o);if(c>127)break;i[s+o]=c}if(o!==r){o!==0&&(n=n.slice(o)),s=t(s,r,r=o+n.length*3,1)>>>0;const c=y().subarray(s+o,s+r),l=v.encodeInto(n,c);o+=l.written,s=t(s,r,o,1)>>>0}return p=o,s}function f(n){const e=a.__wbindgen_externrefs.get(n);return a.__externref_table_dealloc(n),e}let S=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});S.decode();const Oe=2146435072;let M=0;function ze(n,e){return M+=e,M>=Oe&&(S=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),S.decode(),M=e),S.decode(y().subarray(n,n+e))}const v=new TextEncoder;"encodeInto"in v||(v.encodeInto=function(n,e){const t=v.encode(n);return e.set(t),{read:n.length,written:t.length}});let p=0,a;function Y(n,e){return a=n.exports,b=null,w=null,a.__wbindgen_start(),a}async function Fe(n,e){if(typeof Response=="function"&&n instanceof Response){if(!n.ok)throw new Error(`failed to fetch Wasm: ${n.status} ${n.statusText} fetching '${n.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(n,e)}catch(s){if(t(n.type)&&n.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",s);else throw s}const r=await n.arrayBuffer();return await WebAssembly.instantiate(r,e)}else{const r=await WebAssembly.instantiate(n,e);return r instanceof WebAssembly.Instance?{instance:r,module:n}:r}function t(r){switch(r){case"basic":case"cors":case"default":return!0}return!1}}function Be(n){if(a!==void 0)return a;n!==void 0&&(Object.getPrototypeOf(n)===Object.prototype?{module:n}=n:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=q();n instanceof WebAssembly.Module||(n=new WebAssembly.Module(n));const t=new WebAssembly.Instance(n,e);return Y(t)}async function Le(n){if(a!==void 0)return a;n!==void 0&&(Object.getPrototypeOf(n)===Object.prototype?{module_or_path:n}=n:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),n===void 0&&(n=new URL("/assets/vimp_snakes_core_bg-uUik_EAz.wasm",import.meta.url));const e=q();(typeof n=="string"||typeof Request=="function"&&n instanceof Request||typeof URL=="function"&&n instanceof URL)&&(n=fetch(n));const{instance:t,module:r}=await Fe(await n,e);return Y(t)}const We=Object.freeze(Object.defineProperty({__proto__:null,ClientCore:P,GameCore:T,default:Le,initSync:Be},Symbol.toStringTag,{value:"Module"}));export{Ue as default};