UNPKG

multyx-client

Version:

Framework designed to simplify the creation of multiplayer browser games by addressing the complexities of managing server-client communication, shared state, and input handling

76 lines (75 loc) 2.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EditWrapper = exports.Edit = exports.Add = exports.Done = exports.Unpack = void 0; exports.Interpolate = Interpolate; exports.BuildConstraint = BuildConstraint; exports.Unpack = Symbol("unpack"); exports.Done = Symbol("done"); exports.Add = Symbol("add"); exports.Edit = Symbol("edit"); class EditWrapper { constructor(value) { this.value = value; } } exports.EditWrapper = EditWrapper; /** * Set a customized interpolation curve for values to follow * @param values Slices to interpolate through. Time must be between 0 and 1, while progress is the percentage between the old value and new value at the respective time, where 0 represents old value and 1 represents new value * @example * ```js * car.get('speed').interpolate([ * { time: 0, progress: 0 }, * { time: 0.2, progress: 0.6 }, * { time: 0.4, progress: 1.2 }, * { time: 0.6, progress: 1.4 }, * { time: 0.8, progress: 1.2 }, * { time: 1, progress: 1 } * ]); * ``` */ function Interpolate(object, property, interpolationCurve) { let start = { value: object[property], time: Date.now() }; let end = { value: object[property], time: Date.now() }; Object.defineProperty(object, property, { get: () => { const time = end.time - start.time; let lower = interpolationCurve[0]; let upper = interpolationCurve[0]; for (const slice of interpolationCurve) { if (time > slice.time && slice.time > lower.time) lower = slice; if (time < slice.time && slice.time < upper.time) upper = slice; } const sliceTime = (time - lower.time) / (upper.time - lower.time); const ratio = lower.progress + sliceTime * (upper.progress - lower.progress); if (Number.isNaN(ratio)) return start.value; return end.value * ratio + start.value * (1 - ratio); }, set: (value) => { // Don't lerp between edit requests sent in same frame if (Date.now() - end.time < 10) { end.value = value; return true; } start = Object.assign({}, end); end = { value, time: Date.now() }; return true; } }); } function BuildConstraint(name, args) { if (name == 'min') return n => n >= args[0] ? n : args[0]; if (name == 'max') return n => n <= args[0] ? n : args[0]; if (name == 'int') return n => Math.floor(n); if (name == 'ban') return n => args.includes(n) ? null : n; if (name == 'disabled') return n => args[0] ? null : n; return I => I; }