Spaces:
Running
Running
| class Utils { | |
| /** | |
| * "Real" modulo (always >= 0), not remainder. | |
| */ | |
| static mod(a: number, n: number): number { | |
| return ((a % n) + n) % n; | |
| } | |
| /** | |
| * Return a random integer between min and max (upper bound is exclusive). | |
| */ | |
| static randomInt(maxOrMin: number, max?: number): number { | |
| return (max) | |
| ? maxOrMin + Math.floor(Math.random() * (max - maxOrMin)) | |
| : Math.floor(Math.random() * maxOrMin); | |
| } | |
| static randomFloat(maxOrMin: number, max?: number): number { | |
| return (max) | |
| ? maxOrMin + (Math.random() * (max - maxOrMin)) | |
| : Math.random() * maxOrMin; | |
| } | |
| /** | |
| * Clamp a val to [min, max] | |
| */ | |
| static clamp(val: number, min: number, max: number): number { | |
| return Math.min(Math.max(min, val), max); | |
| } | |
| /** | |
| * Returns a promise that will resolve after the specified time | |
| * @param ms Number of ms to wait | |
| */ | |
| static delay(ms: number) { | |
| return new Promise((resolve, reject) => { | |
| setTimeout(() => resolve(), ms); | |
| }); | |
| } | |
| /** | |
| * Compatibility with iOS' SCNAction.wait() | |
| */ | |
| static wait(duration: number, range: number = 0) { | |
| return this.delay( | |
| duration * 1_000 | |
| - range * 1_000 / 2 | |
| + this.randomInt(range * 1_000) | |
| ); | |
| } | |
| } | |