@vimp-games/snakes 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/assets/vimp_snakes_core_bg-BqmtH1zs.wasm +0 -0
- package/dist/client-DZrdJlPY.js +7 -0
- package/dist/core-node/package.json +16 -0
- package/dist/core-node/vimp_snakes_core.d.ts +231 -0
- package/dist/core-node/vimp_snakes_core.js +743 -0
- package/dist/core-node/vimp_snakes_core_bg.wasm +0 -0
- package/dist/core-node/vimp_snakes_core_bg.wasm.d.ts +56 -0
- package/dist/host-ClLuGvxl.js +1 -0
- package/dist/manifest.json +38 -0
- package/dist/maps/arena.json +1 -0
- package/dist/sounds/death.mp3 +0 -0
- package/dist/sounds/death.webm +0 -0
- package/dist/sounds/shot.mp3 +0 -0
- package/dist/sounds/shot.webm +0 -0
- package/package.json +48 -0
|
Binary file
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
export const memory: WebAssembly.Memory;
|
|
4
|
+
export const __wbg_clientcore_free: (a: number, b: number) => void;
|
|
5
|
+
export const __wbg_gamecore_free: (a: number, b: number) => void;
|
|
6
|
+
export const clientcore_apply_input: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
7
|
+
export const clientcore_debug_json: (a: number) => [number, number];
|
|
8
|
+
export const clientcore_decode_frame: (a: number, b: number, c: number) => [number, number];
|
|
9
|
+
export const clientcore_hot_ptr: (a: number) => number;
|
|
10
|
+
export const clientcore_hot_values: (a: number) => [number, number];
|
|
11
|
+
export const clientcore_my_game_id: (a: number) => number;
|
|
12
|
+
export const clientcore_new: (a: number, b: number) => [number, number, number];
|
|
13
|
+
export const clientcore_offset: (a: number) => number;
|
|
14
|
+
export const clientcore_push_frame: (a: number, b: number, c: number, d: number) => number;
|
|
15
|
+
export const clientcore_reset: (a: number) => void;
|
|
16
|
+
export const clientcore_resync: (a: number) => void;
|
|
17
|
+
export const clientcore_sample: (a: number, b: number) => number;
|
|
18
|
+
export const clientcore_set_active: (a: number, b: number) => void;
|
|
19
|
+
export const clientcore_set_map: (a: number, b: number, c: number) => [number, number];
|
|
20
|
+
export const clientcore_set_model: (a: number, b: number, c: number) => void;
|
|
21
|
+
export const clientcore_sync_panel: (a: number, b: number, c: number) => void;
|
|
22
|
+
export const clientcore_take_divergence: (a: number) => [number, number];
|
|
23
|
+
export const clientcore_take_frames: (a: number) => [number, number];
|
|
24
|
+
export const gamecore_alive_players: (a: number) => [number, number];
|
|
25
|
+
export const gamecore_apply_input: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
|
|
26
|
+
export const gamecore_body_has_events: (a: number) => number;
|
|
27
|
+
export const gamecore_clear: (a: number) => void;
|
|
28
|
+
export const gamecore_debug_json: (a: number) => [number, number];
|
|
29
|
+
export const gamecore_deserialize_state: (a: number, b: number, c: number) => [number, number];
|
|
30
|
+
export const gamecore_frame_bytes: (a: number) => [number, number];
|
|
31
|
+
export const gamecore_frame_ptr: (a: number) => number;
|
|
32
|
+
export const gamecore_is_alive: (a: number, b: number) => number;
|
|
33
|
+
export const gamecore_last_input_seq: (a: number, b: number) => number;
|
|
34
|
+
export const gamecore_load_map: (a: number, b: number, c: number) => [number, number];
|
|
35
|
+
export const gamecore_map_info: (a: number) => [number, number];
|
|
36
|
+
export const gamecore_new: (a: number, b: number) => [number, number, number];
|
|
37
|
+
export const gamecore_pack_body: (a: number) => [number, number];
|
|
38
|
+
export const gamecore_pack_frame: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => number;
|
|
39
|
+
export const gamecore_players_data: (a: number) => [number, number];
|
|
40
|
+
export const gamecore_position_of: (a: number, b: number) => [number, number];
|
|
41
|
+
export const gamecore_remove_actor: (a: number, b: number) => void;
|
|
42
|
+
export const gamecore_remove_players_and_shots: (a: number) => [number, number];
|
|
43
|
+
export const gamecore_remove_scripted_actor: (a: number, b: number) => void;
|
|
44
|
+
export const gamecore_reset_actor: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
|
|
45
|
+
export const gamecore_reset_all_vitals: (a: number) => void;
|
|
46
|
+
export const gamecore_serialize_state: (a: number) => [number, number, number, number];
|
|
47
|
+
export const gamecore_spawn_actor: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number];
|
|
48
|
+
export const gamecore_spawn_scripted_actor: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number];
|
|
49
|
+
export const gamecore_step: (a: number, b: number) => void;
|
|
50
|
+
export const gamecore_take_events: (a: number) => [number, number];
|
|
51
|
+
export const __wbindgen_externrefs: WebAssembly.Table;
|
|
52
|
+
export const __wbindgen_malloc: (a: number, b: number) => number;
|
|
53
|
+
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
|
54
|
+
export const __wbindgen_free: (a: number, b: number, c: number) => void;
|
|
55
|
+
export const __externref_table_dealloc: (a: number) => void;
|
|
56
|
+
export const __wbindgen_start: () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const G=Array.from({length:16},(n,e)=>[{name:`p${e}x`,ty:"f32",interp:"lerp"},{name:`p${e}y`,ty:"f32",interp:"lerp"}]).flat(),Y={s1:{id:1,kind:"indexed8",class:"hot",fields:[...G,{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"}]}},$=[{value:1,radius:8},{value:3,radius:13},{value:8,radius:20}],C={s1:{baseSpeed:260,boostFactor:1.9,turnSpeed:3.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:$,dropRatio:.8,edgeMargin:60,startCrystals:0}}},q={},M=20,j=128,P=1,H=M*j/2,R=H,x=16,N=640,K=Array.from({length:x},(n,e)=>{const t=e/x*Math.PI*2,r=R+Math.cos(t)*N,a=R+Math.sin(t)*N;return[Math.round(r),Math.round(a),Math.round((t*180/Math.PI+180)%360)]}),X={setId:"c1",scale:1,step:j,physicsStatic:[],physicsDynamic:[],layers:{1:[P]},map:Array.from({length:M},()=>Array.from({length:M},()=>P)),respawns:{players:K}},Z={arena:X},Q={title:"Vimp Snakes",parts:{models:C,weapons:q,friendlyFire:!1},snapshot:Y,soundCues:{roundStart:null,victory:null,defeat:null,frag:null,death:null},initialVote:"teamChange",maps:Z,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}},spectatorTeam:"spectators",teams:{players:1,spectators:2},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},length:{key:"l",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},deaths:{key:3,bodyMethod:"=",bodyValue:0,headMethod:"+",headValue:0},latency:{key:4,bodyMethod:"="}},roomDefaults:{maxPlayers:8},roomForm:[{name:"maxPlayers",control:"text",label:"Max players",numeric:!0},{name:"map",control:"select",label:"Map",source:"maps"}]},J={elems:{authId:"auth",fieldsId:"auth-fields",errorId:"auth-error",enterId:"auth-enter",titleId:"auth-title",informsId:"auth-informs"},texts:{title:"Vimp 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:"M",text:"vote"},{keys:"Tab",text:"stats",last:!0}]}]},params:[{name:"model",value:"s1",options:{control:"select",label:"Snake",options:Object.keys(C),validator:"isValidModel",storage:"model"}}],validators:{isValidModel:n=>n in C}},ee={pickup:{file:"shot",priority:80,volume:.35},death:{file:"death",priority:150,volume:.5}},te={codecList:["webm","mp3"],sounds:ee},re={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}}]},componentDependencies:{soundManager:["Snake"]},sounds:te},initIdList:["vimp","panel","chat"],modules:{canvasManager:{canvases:{vimp:{width:960,height:600,aspectRatio:"16:10",baseScale:"1:1",dynamicCamera:!0,shakeCamera:!1}}},controls:{keySetList:[{78:"nextPlayer",80:"prevPlayer"},{65:"left",68:"right",87:"boost",82:"respawn"}]},chat:{params:{messages:{s:["Team {0} is full. Your current team: {1}","Your team: {0}","Your new team: {0}","Your new status: spectator","{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 rank: {0}"],n:["Invalid name","{0} changed name to {1}"],g:["{0} bot snake(s) spawned"]}}},panel:{keys:{c:"crystals",l:"length",d:"dead",wa:"mode",t:"time"},fields:[{name:"crystals",elem:"panel-crystals",type:"value"},{name:"length",elem:"panel-length",type:"value"},{name:"mode",elem:"panel-mode",type:"weapon"},{name:"time",elem:"panel-time",type:"time"},{name:"dead",elem:"panel-dead",type:"value"}]},stat:{params:{columns:["snake","status","crystals","crashes","ping"],heads:{1:"players"},bodies:{1:"players",2:"spectators"},sortList:{players:[[2,!0],[3,!1]]}}},vote:{params:{templates:{teamChange:["Play or watch?","teams",!0],mapChangeBySystem:["Choose the next map"],mapChangeByUser:["{0} suggested the map: {1}",["Yes","No"]]},menu:[["teamChange",["Play / watch","teams"]],["mapChange",["Suggest map","maps"]]]}}},gameInform:{list:["{0} WINS!","SLITHER!","GAME OVER!"]}};class ne{constructor({participants:e,coreAdapter:t,panel:r,stat:a,scripted:c}){this._participants=e,this._coreAdapter=t,this._panel=r,this._stat=a,this._model=c.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 c=0;c<e&&!this._participants.isFull;c+=1){const o=t??this._pickTeam(r);if(!o||!this._hasRoom(o))break;const i=this._participants.createScripted({team:o,model:this._model}),l=this._participants.get(i);this._stat.addUser(i,l.teamId,{name:l.name,status:"",latency:"BOT"}),this._panel.addUser(i),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))}}class se{constructor({participants:e,stat:t}){this._participants=e,this._stat=t}onCoreEvent(e,t){if(!e||typeof e!="object")return;const r=Number(e.id);switch(e.type){case"crystals":this._write(r,{score:Number(e.total)||0});break;case"death":this._write(r,{score:0,deaths:Number(e.crashes)||0}),this._recordBest(r,Number(e.crystals)||0,t);break;case"respawn":this._write(r,{score:0});break}}_write(e,t){const r=this._participants.get(e);r&&this._stat.updateUser(e,r.teamId,t)}_recordBest(e,t,r){if(!r?.getPlayerState)return;const a=r.getPlayerState(e);if(!a)return;const c=Math.max(Number(a.best)||0,t),o=(Number(a.eaten)||0)+t;r.setPlayerState(e,{...a,best:c,eaten:o})}}let B=null;function ae(n){return B=new se(n),{scripted:new ne(n)}}function oe(){return B}const ie={name:"/spawn",handler(n,e,t){const{maxPlayers:r}=n.participants,a=Math.max(1,Math.trunc(Number(t[0]))||1),c=r>0?Math.min(a,r):a,o=n.scripted.createScripted(c);n.chat.pushSystem("BOTS_SPAWNED",[o]),o>0&&n.roundManager.initiateNewRound()}},ce={BOTS_SPAWNED:"g:0"},_e="modulepreload",le=function(n){return"/"+n},W={},de=function(e,t,r){let a=Promise.resolve();if(t&&t.length>0){let l=function(d){return Promise.all(d.map(f=>Promise.resolve(f).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),i=o?.nonce||o?.getAttribute("nonce");a=l(t.map(d=>{if(d=le(d),d in W)return;W[d]=!0;const f=d.endsWith(".css"),h=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${h}`))return;const g=document.createElement("link");if(g.rel=f?"stylesheet":_e,f||(g.as="script"),g.crossOrigin="",g.href=d,i&&g.setAttribute("nonce",i),document.head.appendChild(g),f)return new Promise((D,U)=>{g.addEventListener("load",D),g.addEventListener("error",()=>U(new Error(`Unable to preload CSS for ${d}`)))})}))}function c(o){const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o}return a.then(o=>{for(const i of o||[])i.status==="rejected"&&c(i.reason);return e().catch(c)})},pe=n=>(n??"").endsWith(".js"),me=n=>import(n),ue=()=>de(()=>Promise.resolve().then(()=>Se),[]),ke={id:"snakes",engineApi:3,async createCore(n,{wasmUrl:e}={}){if(pe(e)){const a=await me(e);return new a.GameCore(n)}const{default:t,GameCore:r}=await ue();return await t({module_or_path:e}),new r(n)},gameConfig:Q,authSchema:J,chatCommands:[ie],systemMessages:ce,createModules:ae,buildClientGameConfig:()=>re,onCoreEvent(n,{vimp:e}={}){oe()?.onCoreEvent(n,e)}};class A{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,O.unregister(this),e}free(){const e=this.__destroy_into_raw();s.__wbg_clientcore_free(e,0)}apply_input(e,t,r){const a=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),c=_,o=p(t,s.__wbindgen_malloc,s.__wbindgen_realloc),i=_;s.clientcore_apply_input(this.__wbg_ptr,a,c,o,i,r)}debug_json(){let e,t;try{const r=s.clientcore_debug_json(this.__wbg_ptr);return e=r[0],t=r[1],m(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}decode_frame(e){let t,r;try{const a=I(e,s.__wbindgen_malloc),c=_,o=s.clientcore_decode_frame(this.__wbg_ptr,a,c);return t=o[0],r=o[1],m(o[0],o[1])}finally{s.__wbindgen_free(t,r,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=T(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=_,a=s.clientcore_new(t,r);if(a[2])throw u(a[1]);return this.__wbg_ptr=a[0],O.register(this,this.__wbg_ptr,this),this}offset(){return s.clientcore_offset(this.__wbg_ptr)}push_frame(e,t){const r=I(e,s.__wbindgen_malloc),a=_;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=_,a=s.clientcore_set_map(this.__wbg_ptr,t,r);if(a[1])throw u(a[0])}set_model(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=_;s.clientcore_set_model(this.__wbg_ptr,t,r)}sync_panel(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=_;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],m(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],m(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(A.prototype[Symbol.dispose]=A.prototype.free);class E{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,F.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=T(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*4,4),t}apply_input(e,t,r,a){const c=p(r,s.__wbindgen_malloc,s.__wbindgen_realloc),o=_,i=p(a,s.__wbindgen_malloc,s.__wbindgen_realloc),l=_;s.gamecore_apply_input(this.__wbg_ptr,e,t,c,o,i,l)}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],m(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}deserialize_state(e){const t=I(e,s.__wbindgen_malloc),r=_,a=s.gamecore_deserialize_state(this.__wbg_ptr,t,r);if(a[1])throw u(a[0])}frame_bytes(){const e=s.gamecore_frame_bytes(this.__wbg_ptr);var t=V(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=_,a=s.gamecore_load_map(this.__wbg_ptr,t,r);if(a[1])throw u(a[0])}map_info(){let e,t;try{const r=s.gamecore_map_info(this.__wbg_ptr);return e=r[0],t=r[1],m(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}constructor(e){const t=p(e,s.__wbindgen_malloc,s.__wbindgen_realloc),r=_,a=s.gamecore_new(t,r);if(a[2])throw u(a[1]);return this.__wbg_ptr=a[0],F.register(this,this.__wbg_ptr,this),this}pack_body(){const e=s.gamecore_pack_body(this.__wbg_ptr);if(e[1])throw u(e[0])}pack_frame(e,t,r,a,c,o,i,l){var d=ge(i)?0:p(i,s.__wbindgen_malloc,s.__wbindgen_realloc),f=_;return s.gamecore_pack_frame(this.__wbg_ptr,e,t,r,a,c,o,d,f,l)>>>0}players_data(){let e,t;try{const r=s.gamecore_players_data(this.__wbg_ptr);return e=r[0],t=r[1],m(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=T(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],m(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,c){s.gamecore_reset_actor(this.__wbg_ptr,e,t,r,a,c)}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 u(e[2]);var t=V(e[0],e[1]).slice();return s.__wbindgen_free(e[0],e[1]*1,1),t}spawn_actor(e,t,r,a,c,o){const i=p(t,s.__wbindgen_malloc,s.__wbindgen_realloc),l=_,d=s.gamecore_spawn_actor(this.__wbg_ptr,e,i,l,r,a,c,o);if(d[1])throw u(d[0])}spawn_scripted_actor(e,t,r,a,c,o){const i=p(t,s.__wbindgen_malloc,s.__wbindgen_realloc),l=_,d=s.gamecore_spawn_scripted_actor(this.__wbg_ptr,e,i,l,r,a,c,o);if(d[1])throw u(d[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],m(r[0],r[1])}finally{s.__wbindgen_free(e,t,1)}}}Symbol.dispose&&(E.prototype[Symbol.dispose]=E.prototype.free);function L(){return{__proto__:null,"./vimp_snakes_core_bg.js":{__proto__:null,__wbg_Error_408e67f47ca7b58b:function(e,t){return Error(m(e,t))},__wbg___wbindgen_throw_bb96b2010945f0bc:function(e,t){throw new Error(m(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 O=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>s.__wbg_clientcore_free(n,1)),F=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(n=>s.__wbg_gamecore_free(n,1));function T(n,e){return n=n>>>0,fe().subarray(n/4,n/4+e)}function V(n,e){return n=n>>>0,y().subarray(n/1,n/1+e)}let b=null;function fe(){return(b===null||b.byteLength===0)&&(b=new Float32Array(s.memory.buffer)),b}function m(n,e){return ye(n>>>0,e)}let w=null;function y(){return(w===null||w.byteLength===0)&&(w=new Uint8Array(s.memory.buffer)),w}function ge(n){return n==null}function I(n,e){const t=e(n.length*1,1)>>>0;return y().set(n,t/1),_=n.length,t}function p(n,e,t){if(t===void 0){const i=v.encode(n),l=e(i.length,1)>>>0;return y().subarray(l,l+i.length).set(i),_=i.length,l}let r=n.length,a=e(r,1)>>>0;const c=y();let o=0;for(;o<r;o++){const i=n.charCodeAt(o);if(i>127)break;c[a+o]=i}if(o!==r){o!==0&&(n=n.slice(o)),a=t(a,r,r=o+n.length*3,1)>>>0;const i=y().subarray(a+o,a+r),l=v.encodeInto(n,i);o+=l.written,a=t(a,r,o,1)>>>0}return _=o,a}function u(n){const e=s.__wbindgen_externrefs.get(n);return s.__externref_table_dealloc(n),e}let S=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});S.decode();const he=2146435072;let k=0;function ye(n,e){return k+=e,k>=he&&(S=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),S.decode(),k=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 _=0,s;function z(n,e){return s=n.exports,b=null,w=null,s.__wbindgen_start(),s}async function be(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 we(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=L();n instanceof WebAssembly.Module||(n=new WebAssembly.Module(n));const t=new WebAssembly.Instance(n,e);return z(t)}async function ve(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-BqmtH1zs.wasm",import.meta.url));const e=L();(typeof n=="string"||typeof Request=="function"&&n instanceof Request||typeof URL=="function"&&n instanceof URL)&&(n=fetch(n));const{instance:t,module:r}=await be(await n,e);return z(t)}const Se=Object.freeze(Object.defineProperty({__proto__:null,ClientCore:A,GameCore:E,default:ve,initSync:we},Symbol.toStringTag,{value:"Module"}));export{ke as default};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "snakes",
|
|
3
|
+
"engineApi": 3,
|
|
4
|
+
"version": "57358497931fc0f0",
|
|
5
|
+
"title": "Vimp Snakes",
|
|
6
|
+
"entries": {
|
|
7
|
+
"client": "/games/snakes/client-DZrdJlPY.js",
|
|
8
|
+
"host": "/games/snakes/host-ClLuGvxl.js",
|
|
9
|
+
"wasm": "/games/snakes/assets/vimp_snakes_core_bg-BqmtH1zs.wasm",
|
|
10
|
+
"wasmNode": "./core-node/vimp_snakes_core.js"
|
|
11
|
+
},
|
|
12
|
+
"assetsBase": "/games/snakes/",
|
|
13
|
+
"maps": {
|
|
14
|
+
"version": "49eedae6135dc5fb",
|
|
15
|
+
"list": [
|
|
16
|
+
"arena"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"roomDefaults": {
|
|
20
|
+
"maxPlayers": 8,
|
|
21
|
+
"map": "arena"
|
|
22
|
+
},
|
|
23
|
+
"roomForm": [
|
|
24
|
+
{
|
|
25
|
+
"name": "maxPlayers",
|
|
26
|
+
"control": "text",
|
|
27
|
+
"label": "Max players",
|
|
28
|
+
"numeric": true,
|
|
29
|
+
"regExp": "[1-8]"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "map",
|
|
33
|
+
"control": "select",
|
|
34
|
+
"label": "Map",
|
|
35
|
+
"source": "maps"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"setId":"c1","scale":1,"step":128,"physicsStatic":[],"physicsDynamic":[],"layers":{"1":[1]},"map":[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],"respawns":{"players":[[1920,1280,180],[1871,1525,203],[1733,1733,225],[1525,1871,248],[1280,1920,270],[1035,1871,293],[827,1733,315],[689,1525,338],[640,1280,0],[689,1035,23],[827,827,45],[1035,689,68],[1280,640,90],[1525,689,113],[1733,827,135],[1871,1035,158]]}}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vimp-games/snakes",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Vimp Snakes — a VIMP game plugin",
|
|
5
|
+
"author": "lgick",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=20.11.0"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "rm -rf dist && npm run build:client && npm run build:host && npm run build:assets && npm run build:manifest",
|
|
19
|
+
"build:client": "vite build --mode client",
|
|
20
|
+
"build:host": "vite build --mode host",
|
|
21
|
+
"build:assets": "node ./scripts/export-maps.js && node ./scripts/copy-game-sounds.js && node ./scripts/copy-game-images.js",
|
|
22
|
+
"build:manifest": "node ./scripts/build-game-manifest.js",
|
|
23
|
+
"audio:process": "node ./scripts/process-audio.js",
|
|
24
|
+
"core:build": "npm run core:build:web && npm run core:build:node",
|
|
25
|
+
"core:build:web": "wasm-pack build core --release --target web --out-dir pkg-web",
|
|
26
|
+
"core:build:node": "wasm-pack build core --release --target nodejs --out-dir pkg-node",
|
|
27
|
+
"core:test": "cargo test --workspace",
|
|
28
|
+
"check:contract": "vimp-contract --game .",
|
|
29
|
+
"sim": "vimp-sim --game .",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"predev": "node ./scripts/copy-game-images.js && node ./scripts/copy-game-sounds.js",
|
|
33
|
+
"dev": "vite"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"pixi.js": "^8.14.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@eslint/js": "^9.37.0",
|
|
40
|
+
"eslint": "^9.37.0",
|
|
41
|
+
"globals": "^16.2.0",
|
|
42
|
+
"happy-dom": "^20.10.6",
|
|
43
|
+
"pixi.js": "^8.14.0",
|
|
44
|
+
"vimp-engine": "^0.10.2",
|
|
45
|
+
"vite": "^7.1.11",
|
|
46
|
+
"vitest": "^4.1.9"
|
|
47
|
+
}
|
|
48
|
+
}
|