-- Custom commands
local lastInput = {}
function executeCustomCommands()
local Input = input.get()
if Input.D and not lastInput.D then
printMode = (printMode + 1) % 3
end
lastInput = Input
end
-- Determine game version
function detectVersion()
local value = memory.readword(0x0200000E)
if value == 0x333B then
return "USA"
elseif value == 0x0B91 then
return "JPN"
elseif value == 0xF87A then
return "EUR"
else
print("Couldn't detect ROM version.")
end
end
-- RNG address
version = detectVersion()
function readRNG()
if version == "USA" then
return memory.readdword(0x02108B90)
elseif version == "JPN" then
return memory.readdword(0x02108790)
elseif version == "EUR" then
return memory.readdword(0x0210AD98)
end
end
-- RNG calculations
function RNGStep(iRNG)
local High1 = math.floor(iRNG / 65536)
local Low1 = math.floor(iRNG % 65536)
local High2 = math.floor(214013 / 65536)
local Low2 = math.floor(214013 % 65536)
local NewHigh = (High1 * Low2 + High2 * Low1) % 65536;
local NewLow = Low1 * Low2
return (NewHigh * 65536 + NewLow + 2531011) % 2147483648;
--return (214013 * iRNG + 2531011) % 2147483648
end
function RNGSteps(iRNG, steps)
for i = 1, steps do
iRNG = RNGStep(iRNG)
end
return iRNG
end
function getNumSteps(oldRNG, newRNG, maxSearch)
if oldRNG == -1 then
return -2
end
if oldRNG == newRNG then
return 0
end
for i = 1, maxSearch do
oldRNG = RNGStep(oldRNG)
if oldRNG == newRNG then
return i
end
end
return -1;
end
-- 2 means print all, 1 don't print 1 step advances, 0 print nothing
printMode = 2
RNG = -1
function printRNGChanges()
newRNG = readRNG()
if RNG ~= newRNG then
numSteps = getNumSteps(RNG, newRNG, 1000)
if numSteps ~= -1 then
if printMode >= 2 or (printMode >= 1 and numSteps > 1) then
print(newRNG .. " (" .. numSteps .. ")")
end
elseif printMode >= 1 then
-- Lua code from PHP here
if newRNG == 1627459585 then print(newRNG .. " (Area A-1 reset)")
elseif newRNG == 1627463682 then print(newRNG .. " (Area A-2 reset)")
elseif newRNG == 1627467779 then print(newRNG .. " (Area A-3 reset)")
elseif newRNG == 1627471876 then print(newRNG .. " (Area A-4 reset)")
elseif newRNG == 1644302341 then print(newRNG .. " (Area B-1 reset)")
elseif newRNG == 1644306438 then print(newRNG .. " (Area B-2 reset)")
elseif newRNG == 1644310535 then print(newRNG .. " (Area B-3 reset)")
elseif newRNG == 1644314632 then print(newRNG .. " (Area B-4 reset)")
elseif newRNG == 1661145097 then print(newRNG .. " (Area C-1 reset)")
elseif newRNG == 1661149194 then print(newRNG .. " (Area C-2 reset)")
elseif newRNG == 1661153291 then print(newRNG .. " (Area C-3 reset)")
elseif newRNG == 1677987855 then print(newRNG .. " (Area D-1 reset)")
elseif newRNG == 1677991952 then print(newRNG .. " (Area D-2 reset)")
elseif newRNG == 1677996049 then print(newRNG .. " (Area D-3 reset)")
elseif newRNG == 1678000146 then print(newRNG .. " (Area D-4 reset)")
elseif newRNG == 1678004243 then print(newRNG .. " (Area D-5 reset)")
elseif newRNG == 1694830612 then print(newRNG .. " (Area E-1 reset)")
elseif newRNG == 1694834709 then print(newRNG .. " (Area E-2 reset)")
elseif newRNG == 1694838806 then print(newRNG .. " (Area E-3 reset)")
elseif newRNG == 1694842903 then print(newRNG .. " (Area E-4 reset)")
elseif newRNG == 1694847000 then print(newRNG .. " (Area E-5 reset)")
elseif newRNG == 1694851097 then print(newRNG .. " (Area E-6 reset)")
elseif newRNG == 1694855194 then print(newRNG .. " (Area E-7 reset)")
elseif newRNG == 1694859291 then print(newRNG .. " (Area E-8 reset)")
elseif newRNG == 1711673372 then print(newRNG .. " (Area F-1 reset)")
elseif newRNG == 1711677469 then print(newRNG .. " (Area F-2 reset)")
elseif newRNG == 1711681566 then print(newRNG .. " (Area F-3 reset)")
elseif newRNG == 1711685663 then print(newRNG .. " (Area F-4 reset)")
elseif newRNG == 1711689760 then print(newRNG .. " (Area F-5 reset)")
elseif newRNG == 1728516129 then print(newRNG .. " (Area G-1 reset)")
elseif newRNG == 1728520226 then print(newRNG .. " (Area G-2 reset)")
elseif newRNG == 1728524323 then print(newRNG .. " (Area G-3 reset)")
elseif newRNG == 1728528420 then print(newRNG .. " (Area G-4 reset)")
elseif newRNG == 1728532517 then print(newRNG .. " (Area G-5 reset)")
elseif newRNG == 1745358886 then print(newRNG .. " (Area H-1 reset)")
elseif newRNG == 1745362983 then print(newRNG .. " (Area H-2 reset)")
elseif newRNG == 1745367080 then print(newRNG .. " (Area H-3 reset)")
elseif newRNG == 1745371177 then print(newRNG .. " (Area H-4 reset)")
elseif newRNG == 1762201642 then print(newRNG .. " (Area I-1 reset)")
elseif newRNG == 1762205739 then print(newRNG .. " (Area I-2 reset)")
elseif newRNG == 1762209836 then print(newRNG .. " (Area I-3 reset)")
elseif newRNG == 1762213933 then print(newRNG .. " (Area I-4 reset)")
elseif newRNG == 1762218030 then print(newRNG .. " (Area I-5 reset)")
elseif newRNG == 1779044399 then print(newRNG .. " (Area J-1 reset)")
elseif newRNG == 1779048496 then print(newRNG .. " (Area J-2 reset)")
elseif newRNG == 1779052593 then print(newRNG .. " (Area J-3 reset)")
elseif newRNG == 1779056690 then print(newRNG .. " (Area J-4 reset)")
elseif newRNG == 1779060787 then print(newRNG .. " (Area J-5 reset)")
elseif newRNG == 1795887156 then print(newRNG .. " (Area K-1 reset)")
elseif newRNG == 1795891253 then print(newRNG .. " (Area K-2 reset)")
elseif newRNG == 1795895350 then print(newRNG .. " (Area K-3 reset)")
elseif newRNG == 1795899447 then print(newRNG .. " (Area K-4 reset)")
elseif newRNG == 1812729913 then print(newRNG .. " (Area L-1 reset)")
elseif newRNG == 1812734010 then print(newRNG .. " (Area L-2 reset)")
elseif newRNG == 1812738107 then print(newRNG .. " (Area L-3 reset)")
elseif newRNG == 1812742204 then print(newRNG .. " (Area L-4 reset)")
elseif newRNG == 1829572669 then print(newRNG .. " (Area M-1 reset)")
elseif newRNG == 1829576766 then print(newRNG .. " (Area M-2 reset)")
elseif newRNG == 1829580863 then print(newRNG .. " (Area M-3 reset)")
elseif newRNG == 1846415424 then print(newRNG .. " (Area N-1 reset)")
elseif newRNG == 1863258177 then print(newRNG .. " (Area O-1 reset)")
elseif newRNG == 1863262274 then print(newRNG .. " (Area O-2 reset)")
elseif newRNG == 2014318659 then print(newRNG .. " (Area X-1 reset)")
elseif newRNG == 2014322756 then print(newRNG .. " (Area X-2 reset)")
elseif newRNG == 2014326853 then print(newRNG .. " (Area X-3 reset)")
elseif newRNG == 2047938630 then print(newRNG .. " (Transerver room reset)")
elseif newRNG == 2047942727 then print(newRNG .. " (Boss room reset)")
-- Unknown advance
else print(newRNG)
end
end
RNG = newRNG
end
end
-- GUI text
local x = 1
local y = 1
function drawGUI()
if printMode == 0 then
gui.text(x, y, "Nothing", "#FF0000")
elseif printMode == 1 then
gui.text(x, y, "Moderate", "#FFFF00")
elseif printMode == 2 then
gui.text(x, y, "Complete", "#00FF00")
end
end
-- Main loop
function main()
executeCustomCommands()
printRNGChanges()
end
emu.registerbefore(main)
gui.register(drawGUI)