Prints a bunch of information about the RNG, USA ROM only. Watch it at work here:
https://www.youtube.com/watch?v=sUQDQpDrmfs
local function Multiply(int1, int2)
local High1 = math.floor(int1 / 32768)
local Low1 = math.floor(int1 % 32768)
local High2 = math.floor(int2 / 32768)
local Low2 = math.floor(int2 % 32768)
local NewHigh = (High1 * Low2 + High2 * Low1) % 32768;
local NewLow = Low1 * Low2
return (NewHigh * 32768 + NewLow) % 1073741824;
end
function RNGStep(i)
local i4 = (i * 4 + 1) % 1073741824
return Multiply(i4, i + 1)
end
local function RNGSteps(iRNG, iTimes)
while iTimes > 0 do
iRNG = RNGStep(iRNG)
iTimes = iTimes - 1
end
return iRNG
end
local function getNumSteps(oldRNG, newRNG)
if oldRNG == newRNG then
return 0
end
for i = 1, 200 do
oldRNG = RNGStep(oldRNG)
if oldRNG == newRNG then
return i
end
end
return -1;
end
local function RNGFrameAdv(iRNG, GameTime)
local x = GameTime + RNGStep(iRNG)
local newRNG = RNGStep(x)
newRNG = newRNG + (math.floor(newRNG / 2) % 2)
return newRNG
end
local function RNGMenuAdv(iRNG)
for i = 1, 80 do
iRNG = RNGStep(iRNG)
iRNG = iRNG + (math.floor(iRNG / 2) % 2)
end
return iRNG
end
local MapTimerAddr = 0x2189394
MapTimer = -1
MapTimerFrame = -1
function readMapTimer()
local newMapTime = memory.readdword(MapTimerAddr)
if MapTimer == newMapTime then
MapTimerFrame = MapTimerFrame + 1
else
MapTimer = newMapTime
MapTimerFrame = 1
-- Player map timer increased? Then AI Day is certainly over
AIDayActive = false
end
end
local GameTimerAddr = 0x27C0738
GameTimer = -1
GameTimerFrame = -1
function readGameTimer()
local newGameTime = memory.readdword(GameTimerAddr)
if GameTimer == newGameTime then
GameTimerFrame = GameTimerFrame + 1
else
GameTimer = newGameTime
GameTimerFrame = 1
end
end
local RNGAddr = 0x216E2B4
RNG = -1
TotalNumSteps = 0
function readRNG(printChanges)
newRNG = memory.readdword(RNGAddr)
if RNG ~= newRNG then
printText = ''
if RNG ~= -1 then
local numSteps = getNumSteps(RNG, newRNG)
if numSteps ~= -1 then
TotalNumSteps = TotalNumSteps + numSteps
printText = newRNG .. ' (' .. numSteps .. ')' .. ' Total: ' .. TotalNumSteps .. ' at ' .. GameTimer
else
TotalNumSteps = 0
-- FrameBasedAdvance! AI Day started
if newRNG == RNGFrameAdv(RNG, GameTimer) then
printText = newRNG .. ' (Frame ' .. GameTimer .. ')'
AIDayActive = true
else
local menuRNG = RNG
for i = 1, 10 do
menuRNG = RNGMenuAdv(menuRNG)
if newRNG == menuRNG then
printText = newRNG .. ' (Menu * ' .. i .. ' at ' .. GameTimer .. ')'
AIDayActive = false
end
end
end
end
end
if printChanges then
if printText ~= '' then
print(printText)
else
print(newRNG)
end
end
RNG = newRNG
end
end
function main()
readMapTimer()
readGameTimer()
readRNG(true)
end
emu.registerbefore(main)