@aresrpg/aresrpg-sdk
Version:
General SDK to interract with AresRPG
75 lines (63 loc) • 1.55 kB
JavaScript
/* eslint-disable @typescript-eslint/naming-convention */
// From http://baagoe.com/en/RandomMusings/javascript/
function Mash() {
let n = 0xefc8249d
const mash = data => {
const str = String(data)
for (let i = 0; i < str.length; i++) {
n += str.charCodeAt(i)
let h = 0.02519603282416938 * n
n = h >>> 0
h -= n
h *= n
n = h >>> 0
h -= n
n += h * 0x100000000 // 2^32
}
return (n >>> 0) * 2.3283064365386963e-10 // 2^-32
}
mash.version = 'Mash 0.9'
return mash
}
export default function Alea(...args) {
let s0 = 0
let s1 = 0
let s2 = 0
let c = 1
if (args.length === 0) {
args = [+new Date()]
}
let mash = Mash()
s0 = mash(' ')
s1 = mash(' ')
s2 = mash(' ')
for (let i = 0; i < args.length; i++) {
s0 -= mash(args[i])
if (s0 < 0) s0 += 1
s1 -= mash(args[i])
if (s1 < 0) s1 += 1
s2 -= mash(args[i])
if (s2 < 0) s2 += 1
}
mash = null
const random = function () {
const t = 2091639 * s0 + c * 2.3283064365386963e-10 // 2^-32
s0 = s1
s1 = s2
return (s2 = t - (c = t | 0))
}
random.next = random
random.uint32 = () => random() * 0x100000000 // 2^32
random.fract53 = () =>
random() + ((random() * 0x200000) | 0) * 1.1102230246251565e-16 // 2^-53
random.version = 'Alea 0.9'
random.args = args
random.exportState = () => [s0, s1, s2, c]
random.importState = state => {
s0 = +state[0] || 0
s1 = +state[1] || 0
s2 = +state[2] || 0
c = +state[3] || 0
}
return random
}