mkjs/code/formats/Net/netKart.js

113 lines
3.5 KiB
JavaScript

//
// netKart.js
//--------------------
// Singleton for serializing and restoring kart data.
// by RHY3756547
//
// includes: gl-matrix.js (glMatrix 2.0)
// /entities/kart.js
//
window.netKart = new function() {
var animNames = ["drive", "win", "lose", "spin"]
this.saveKart = saveKart;
this.restoreKart = restoreKart;
function saveKart(view, off, k, input) { // requires 0x60 bytes of space from the offset location
saveVec3(view, off, k.pos);
saveVec3(view, off+0xC, k.vel);
view.setFloat32(off+0x18, k.angle, true);
view.setFloat32(off+0x1C, k.physicalDir, true);
view.setFloat32(off+0x20, k.driftOff, true);
if (k.cannon != null) view.setUint16(off+0x24, k.cannon, true);
else view.setUint16(off+0x24, 0xFFFF, true);
view.setUint16(off+0x26, k.airTime, true);
view.setUint16(off+0x28, k.lastCollided, true);
view.setUint8(off+0x2A, k.boostMT);
view.setUint8(off+0x2B, k.boostNorm);
view.setUint16(off+0x2C, k.stuckTo, true);
view.setUint8(off+0x2E, k.wheelTurn);
saveVec3(view, off+0x30, k.kartColVel);
view.setUint8(off+0x3C, k.kartColTimer);
saveVec3(view, off+0x3D, k.kartTargetNormal);
saveVec3(view, off+0x49, k.trackAttach);
var driftFlags = ((k.drifting)?1:0)|(k.driftMode<<1)|((k.driftLanded)?8:0);
view.setUint8(off+0x55, driftFlags);
view.setUint8(off+0x56, animNames.indexOf(k.animMode));
var binput = ((input.accel)?1:0)|((input.decel)?2:0)|((input.drift)?4:0);
view.setUint8(off+0x57, binput);
view.setFloat32(off+0x58, input.turn, true);
view.setFloat32(off+0x5C, input.airTurn, true);
}
function restoreKart(view, off, k) { // we use the same endianness format as the ds to avoid confusion.
try {
k.pos = readVec3(view, off, k.pos);
k.vel = readVec3(view, off+0xC, k.vel);
k.angle = view.getFloat32(off+0x18, true);
k.physicalDir = view.getFloat32(off+0x1C, true);
k.driftOff = view.getFloat32(off+0x20, true);
k.cannon = view.getUint16(off+0x24, true);
if (k.cannon == 0xFFFF) k.cannon = null;
k.airTime = view.getUint16(off+0x26, true);
k.lastCollided = view.getUint16(off+0x28, true);
k.boostMT = view.getUint8(off+0x2A);
k.boostNorm = view.getUint8(off+0x2B);
k.stuckTo = view.getUint16(off+0x2C, true);
k.wheelTurn = view.getUint8(off+0x2E);
k.kartColVel = readVec3(view, off+0x30, k.kartColVel);
k.kartColTimer = view.getUint8(off+0x3C);
k.kartTargetNormal = readVec3(view, off+0x3D, k.kartTargetNormal);
k.trackAttach = readVec3(view, off+0x49, k.trackAttach);
var driftFlags = view.getUint8(off+0x55);
k.drifting = driftFlags&1;
k.driftMode = (driftFlags>>1)&3;
k.driftLanded = driftFlags&8;
k.animMode = animNames[view.getUint8(off+0x56)];
k.controller.binput = view.getUint8(off+0x57);
k.controller.turn = view.getFloat32(off+0x58, true);
k.controller.airTurn = view.getFloat32(off+0x5C, true);
} catch (err) {
console.err("Kart restore failure:"+err.message);
//failed to restore kart data. may wish to disconnect on this, but it's probably better to not react.
}
}
function saveVec3(view, off, vec) {
var vec = vec;
if (vec == null) vec = [NaN, NaN, NaN];
view.setFloat32(off, vec[0], true);
view.setFloat32(off+4, vec[1], true);
view.setFloat32(off+8, vec[2], true);
}
function readVec3(view, off, vec) {
var first = view.getFloat32(off, true);
if (isNaN(first)) return null;
vec = vec3.create();
vec[0] = first;
vec[1] = view.getFloat32(off+4, true);
vec[2] = view.getFloat32(off+8, true);
return vec;
}
}