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
JavaScript
;
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;
}