-- SNES Madou Monogatari Level-up Simulator 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") end end } end -- [ main routine ] ----------------------------------------------------------- local RNG = madouRNG() if #arg >= 1 then RNG:init(tonumber(arg[1])) else RNG:init(tonumber(io.read())) end local hp = RNG:get(5) + 15 local mp = RNG:get(2) + 4 local pow = RNG:get(2) + 2 local def = RNG:get(2) + 2 local spd = RNG:get(2) + 2 local a134d = RNG:get(2) + 2 local a1351 = RNG:get(2) + 2 local a1352 = RNG:get(2) + 2 print(string.format([[ HP : +%-2d (15...19) MP : +%-2d (4...5) POW : +%-2d (2...3; max=120) DEF : +%-2d (2...3; max=120) SPD : +%-2d (2...3; max=120) 134D : +%-2d (2...3; max=120) 1351 : +%-2d (2...3; max=120) 1352 : +%-2d (2...3; max=120)]], hp, mp, pow, def, spd, a134d, a1351, a1352))