UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

139 lines (120 loc) 2.97 kB
import { assert } from "../../assert.js"; import { computeHashFloat } from "../../primitives/numbers/computeHashFloat.js"; /** * Linear polynomial modifier in form of : a*x + b * @example if x is 5, and modifier a=3 and b=7 then we get 3*5 + 7 = 23 */ class LinearModifier { /** * @param {number} [a=1] gradient (slope) * @param {number} [b=0] constant (intercept) * @constructor */ constructor(a = 1, b = 0) { assert.isNumber(a, 'a'); assert.isNumber(b, 'b'); /** * gradient (slope) * @readonly * @type {number} */ this.a = a; /** * constant (intercept) * @readonly * @type {number} */ this.b = b; /** * * @type {number} */ this.source = 0; /** * Whenever this modifier is grated by another persistent effect * @type {boolean} */ this.transient = false; } /** * * @param {LinearModifier} other */ copy(other) { this.a = other.a; this.b = other.b; this.source = other.source; this.transient = other.transient; } /** * * @return {LinearModifier} */ clone() { const r = new LinearModifier(); r.copy(this); return r; } /** * Combines other modifier onto this one. * @param {LinearModifier} other */ add(other) { this.a += (other.a - 1); this.b += other.b; } /** * * @param {LinearModifier} other * @returns {boolean} */ equals(other) { return this.a === other.a && this.b === other.b && this.source === other.source && this.transient === other.transient; } /** * * @return {number} */ hash() { return computeHashFloat(this.a) ^ computeHashFloat(this.b) ^ this.source ^ (this.transient ? 0 : 1); } toString() { return `LinearModifier{ a:${this.a}, b:${this.b} }`; } toJSON() { return { a: this.a, b: this.b, source: this.source, transient: this.transient }; } fromJSON({ a = 1, b = 0, source = 0, transient = false }) { this.a = a; this.b = b; this.source = source; this.transient = transient; } } /** * @readonly * @type {LinearModifier} */ LinearModifier.CONSTANT_ONE = Object.freeze(new LinearModifier(0, 1)); /** * @readonly * @type {LinearModifier} */ LinearModifier.CONSTANT_ZERO = Object.freeze(new LinearModifier(0, 0)); export default LinearModifier;