-- LCG (RNG) of SNES Madou Monogatari (ported by gocha)require("bit")function madouRNG() return{seed = 0;init = function(rng, rs) rng.seed = math.floor(rs)end;get = function(rng, range) -- This multiplier returns a wrong result when the true result exceeds 255. local madouRNGMul = function(a, b) local a1a02, a1a04 = 0, 0 local a1a06 = a -- 0000h...ffffh local a1a08 = b * 0x100 -- b = 00h...ffh for x = 1, 8 do a1a02 = bit.band(bit.lshift(a1a02, 1), 0xffff) a1a04 = bit.band(bit.lshift(a1a04, 1), 0xffff) + bit.rshift(a1a04, 15) local C = bit.band(a1a08, 0x8000) ~= 0 a1a08 = bit.band(bit.lshift(a1a08, 1), 0xffff) if C then a1a02 = a1a02 + a1a06 if a1a02 > 0xffff then a1a04 = a1a04 + 1 end a1a02 = bit.band(a1a02, 0xffff) end end return bit.rshift(a1a04, 16) + a1a02 end rng.seed = rng.seed * 5 + 1 + bit.band(bit.rshift(rng.seed, 14), 1) return bit.band(bit.rshift(madouRNGMul(math.floor(range), bit.band(rng.seed, 0xff)), 8), 0xffff)end;getLua = function(rng, ...) local arg = {...} if #arg == 0 then return rng:get(256) * (1.0/255.0) elseif #arg == 1 then local u = math.floor(arg[1]) if 1 <= u then return rng:get(u)+1 else error("bad argument #1 to 'getLua' (internal is empty)") end elseif #arg == 2 then local l, u = math.floor(arg[1]), math.floor(arg[2]) if l <= u then return rng:get(u-l+1)+l else error("bad argument #2 to 'getLua' (internal is empty)") end else error("wrong number of arguments") endend}endlocal RNG = madouRNG()RNG:init(os.time())for i = 1, 20 do print(RNG:get(6)+1)end