Battle RNG graph added from FractalFusion's script. Now "next encounter" mode displays the IVs and nature of stationary encounter. Descriptions are added to the natures.
-- Lua Script made by MKDasher
-- Based on gen 3 lua scripts by FractalFusion
-- Japanese D/P support added by Fortranm
--TODO:
-- Roaming pkm (birds)
-- Next pkrs frame
-- Object rate for pokemon
-------------------------
local testingseed_forRNG = 0xCC08142A
-------------------------
local land_mode = 1 -- menu mode (Auto = default)
local land_modehitbox = {0, 70, 106, 143}
local curland_mode = 0 -- real mode
local land = 0 -- selected mode
local landstr = {"Grass", "Water"}
local movement_mode = 1
local curmovement_mode = 1
local movement_rate
local movement_str = {"Walk", "Swim", "Bike"}
local movement_modehitbox = {0,64,94,124,155}
local encrate_mode = 1
local encrate_modehitbox = {0, 53, 71, 89, 107, 125, 143}
local hitboxstart = 73
local hitboxheight = -35
local menuvisible = 0
local bottommenu_mode = 1
local bottommenu_str = {" Battle ", "Next encs ", " Slots "," Misc "}
local encrate = 0
local curencrate = 0
local stepcounter = 0
local maxstepcounter = 0
local rshift, lshift=bit.rshift, bit.lshift
local lastRNG = 0
local i
local tabl={}
local prev={}
local hour = 0
local game = 1
local gamename = ""
local pointerAddr = {0x02106FAC, 0x02101D2C, 0x02108804}
local stepcounterAddrOffset = {0x2FA40, 0x2E834, 0x2FA40}
local stepcnt128AddrOffset = {0xE044, 0xDE34, 0xE044}
local RNGAddr = {0x021C4D48, 0x021BFB14, 0x021C65A8}
local curlandmodeAddrOffset = {0x31AE2, 0x3090A, 0x31AE2}
local curmovementmodeAddrOffset = {0x31950, 0x30778, 0x31950}
local grassEncAddrOffset = {0x315C0, 0x303C4, 0x315C0}
local waterEncAddrOffset = {0x3168C, 0x30490, 0x3168C}
local framecountAddr = {0x021C48E4, 0x021BF6A8, 0x021C6144}
local IGTAddrOffset = {0xD29A, 0xD07E, 0xD29A}
local clockAddr = {0x021C4828, 0x021BF5E8, 0x021C6088}
local TIDAddrOffset = {0xD288, 0xD06C, 0xD288}
local LIDAddrOffset = {0xE028, 0xDE18, 0xE028}
local encslots_pkm = {}
local encslots_lvl = {}
local waterslots_pkm = {}
local waterslots_minlvl = {}
local waterslots_maxlvl = {}
function drawsquare(a,b,c)
gui.box(a,b,a+4,b+4,c)
end
function drawarrowdown(a,b,c)
gui.line(a,b,a-2,b-2,c)
gui.line(a,b,a+2,b-2,c)
gui.line(a,b,a,b-6,c)
end
function drawarrowleft(a,b,c)
gui.line(a,b+3,a+2,b+5,c)
gui.line(a,b+3,a+2,b+1,c)
gui.line(a,b+3,a+6,b+3,c)
end
function drawarrowright(a,b,c)
gui.line(a,b+3,a-2,b+5,c)
gui.line(a,b+3,a-2,b+1,c)
gui.line(a,b+3,a-6,b+3,c)
end
function mult32(a,b)
local c=rshift(a,16)
local d=a%0x10000
local e=rshift(b,16)
local f=b%0x10000
local g=(c*f+d*e)%0x10000
local h=d*f
local i=g*0x10000+h
return i
end
function gettop(a)
return(rshift(a,16))
end
function getbits(a,b,d)
return rshift(a,b)%lshift(1,d)
end
local multspa={
0x41C64E6D, 0xC2A29A69, 0xEE067F11, 0xCFDDDF21, 0x5F748241, 0x8B2E1481, 0x76006901, 0x1711D201,
0xBE67A401, 0xDDDF4801, 0x3FFE9001, 0x90FD2001, 0x65FA4001, 0xDBF48001, 0xF7E90001, 0xEFD20001,
0xDFA40001, 0xBF480001, 0x7E900001, 0xFD200001, 0xFA400001, 0xF4800001, 0xE9000001, 0xD2000001,
0xA4000001, 0x48000001, 0x90000001, 0x20000001, 0x40000001, 0x80000001, 0x00000001, 0x00000001}
local multspb={
0x00006073, 0xE97E7B6A, 0x31B0DDE4, 0x67DBB608, 0xCBA72510, 0x1D29AE20, 0xBA84EC40, 0x79F01880,
0x08793100, 0x6B566200, 0x803CC400, 0xA6B98800, 0xE6731000, 0x30E62000, 0xF1CC4000, 0x23988000,
0x47310000, 0x8E620000, 0x1CC40000, 0x39880000, 0x73100000, 0xE6200000, 0xCC400000, 0x98800000,
0x31000000, 0x62000000, 0xC4000000, 0x88000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000}
function rngAdvance(a)
return mult32(a,0x41C64E6D) + 0x6073
end
function getSeedDistance(a)
test=testingseed_forRNG
distseed=0
for j=0,31,1 do
if getbits(a,j,1)~=getbits(test,j,1) then
test=mult32(test,multspa[j+1])+multspb[j+1]
distseed=distseed+bit.lshift(1,j)
if j==31 then
distseed=distseed+0x100000000
end
end
end
return distseed
end
function fillEncSlots()
-- fill grass slots
slotAddr = pointer + grassEncAddrOffset[game] + 4
for i=1,12,1 do
encslots_lvl[i] = memory.readdword(slotAddr)
slotAddr = slotAddr + 4
encslots_pkm[i] = memory.readdword(slotAddr)
slotAddr = slotAddr + 4
end
-- overwrite slot 2 and 3 (3 and 4 in the array) with day / night encounters
slotAddr = pointer + grassEncAddrOffset[game] + 0x6c
if hour >= 10 and hour < 20 then --day
encslots_pkm[3] = memory.readdword(slotAddr)
encslots_pkm[4] = memory.readdword(slotAddr + 4)
elseif hour >= 20 or hour < 4 then --night
encslots_pkm[3] = memory.readdword(slotAddr + 8)
encslots_pkm[4] = memory.readdword(slotAddr + 12)
end
-- fill water slots
slotAddr = pointer + waterEncAddrOffset[game] + 4
for i=1,5,1 do
waterslots_maxlvl[i] = memory.readbyte(slotAddr)
slotAddr = slotAddr + 1
waterslots_minlvl[i] = memory.readbyte(slotAddr)
slotAddr = slotAddr + 3
waterslots_pkm[i] = memory.readdword(slotAddr)
slotAddr = slotAddr + 4
end
end
function ModeHandler()
curland_mode = memory.readbyte(pointer + curlandmodeAddrOffset[game])
if (curland_mode == 16 or curland_mode == 21) then --16 and 21 are water values
curland_mode = 2
else
curland_mode = 1
end
if land_mode == 2 then -- Grass
land = 1
elseif land_mode == 3 then --(Water)
land = 2
else --(Auto)
land = curland_mode
end
if land == 1 then -- Grass
curencrate = memory.readbyte(pointer + grassEncAddrOffset[game])
else -- land == 2 --(Water)
curencrate = memory.readbyte(pointer + waterEncAddrOffset[game])
end
maxstepcounter = 8 - lshift(curencrate,8) / 2560
encrate = curencrate
if encrate_mode > 1 then
encrate = 5 * encrate_mode
end
-- 1 = walk, 6 = swim, 3 = bike
curmovement_mode = memory.readdword(pointer + curmovementmodeAddrOffset[game])
-- Since I store mode on array [walk, swim, bike], I convert mode 6 (swim) to 2
if curmovement_mode == 6 then
curmovement_mode = 2
elseif curmovement_mode ~= 3 then
curmovement_mode = 1 -- just to avoid lua crashing
end
movement_rate = 40
if (movement_mode == 1 and curmovement_mode == 3) or movement_mode == 4 then --bike
movement_rate = 70 -- bike enc rate
end
--print modes
if menuvisible == 0 then
gui.box(0,hitboxheight-5,12,0,"#00FF00B0")
gui.text(3,hitboxheight-3, "S\nH\nO\nW\n", "#88FF88B0")
else
gui.box(0,hitboxheight,256,0,"#000000B0")
gui.box(0,hitboxheight-5,12,0,"#FF0000B0")
gui.text(3,hitboxheight-3, "H\nI\nD\nE\n", "#FF8888B0")
gui.box(land_modehitbox[1]+hitboxstart,hitboxheight,land_modehitbox[4]+hitboxstart,hitboxheight+10,"#FF0000B0", "#00000000")
gui.box(movement_modehitbox[1]+hitboxstart,hitboxheight+10,movement_modehitbox[5]+hitboxstart,hitboxheight+20,"#FF0000B0", "#00000000")
gui.box(encrate_modehitbox[1]+hitboxstart,hitboxheight+20,encrate_modehitbox[7]+hitboxstart,hitboxheight+30,"#FF0000B0", "#00000000")
gui.box(land_modehitbox[land_mode]+hitboxstart,hitboxheight,land_modehitbox[land_mode+1]+hitboxstart,hitboxheight+10,"#0000FFFF", "#00000000")
gui.box(movement_modehitbox[movement_mode]+hitboxstart,hitboxheight+10,movement_modehitbox[movement_mode+1]+hitboxstart,hitboxheight+20,"#0000FFFF", "#00000000")
gui.box(encrate_modehitbox[encrate_mode]+hitboxstart,hitboxheight+20,encrate_modehitbox[encrate_mode+1]+hitboxstart,hitboxheight+30,"#0000FFFF", "#00000000")
gui.text(15, hitboxheight+2, "LandType: Auto(" .. landstr[curland_mode] .. ") Grass Water","#FFFFFFB0")
gui.text(15, hitboxheight+12, "Movement: Auto(" .. movement_str[curmovement_mode] .. ") Walk Swim Bike","#FFFFFFB0")
if curencrate == 0 then
gui.text(15, hitboxheight+22, "Enc.rate: Auto( 0) 10 15 20 25 30","#FFFFFFB0")
else
gui.text(15, hitboxheight+22, "Enc.rate: Auto(" .. curencrate .. ") 10 15 20 25 30","#FFFFFFB0")
end
end
end
function UpdateTab()
tabl = input.get()
if tabl["1"] and not prev["1"] then
cur=memory.readdword(RNGAddr[game])
cur=mult32(cur,0XEEB9EB65) + 0XA3561A1
memory.writedword(RNGAddr[game], bit.band(cur))
end
if tabl["2"] and not prev["2"] then
cur=memory.readdword(RNGAddr[game])
cur=mult32(cur,0x41C64E6D) + 0x6073
memory.writedword(RNGAddr[game], bit.band(cur))
end
if tabl["3"] and not prev["3"] then
if bottommenu_mode == 1 then
bottommenu_mode = 4
else
bottommenu_mode = bottommenu_mode - 1
end
end
if tabl["4"] and not prev["4"] then
if bottommenu_mode == 4 then
bottommenu_mode = 1
else
bottommenu_mode = bottommenu_mode + 1
end
end
if tabl["5"] and not prev["5"] then
memory.writedword(RNGAddr[game], bit.band(testingseed_forRNG))
end
if tabl['leftclick'] and not prev['leftclick'] then
x = tabl['xmouse']
y = tabl['ymouse']
if menuvisible == 1 then
if y >= hitboxheight and y < hitboxheight+10 then
for i = 1, 3, 1 do
if x >= land_modehitbox[i]+hitboxstart and x < land_modehitbox[i+1]+hitboxstart then
land_mode = i
break
end
end
end
if y >= hitboxheight+10 and y < hitboxheight+20 then
for i = 1, 4, 1 do
if x >= movement_modehitbox[i]+hitboxstart and x < movement_modehitbox[i+1]+hitboxstart then
movement_mode = i
break
end
end
end
if y >= hitboxheight+20 and y < hitboxheight+30 then
for i = 1, 6, 1 do
if x >= encrate_modehitbox[i]+hitboxstart and x < encrate_modehitbox[i+1]+hitboxstart then
encrate_mode = i
break
end
end
end
end
if x > 0 and x < 12 and y >= hitboxheight and y < hitboxheight+30 then
if menuvisible == 1 then
menuvisible = 0
else
menuvisible = 1
end
end
if x > 1 and x < 15 and y > 177 and y < 189 then
if bottommenu_mode == 1 then
bottommenu_mode = 4
else
bottommenu_mode = bottommenu_mode - 1
end
end
if x > 79 and x < 93 and y > 177 and y < 189 then
if bottommenu_mode == 4 then
bottommenu_mode = 1
else
bottommenu_mode = bottommenu_mode + 1
end
end
end
prev=tabl
end
local pokemonname = {"none", "Bulbasaur", "Ivysaur", "Venusaur", "Charmander", "Charmeleon", "Charizard",
"Squirtle", "Wartortle", "Blastoise", "Caterpie", "Metapod", "Butterfree",
"Weedle", "Kakuna", "Beedrill", "Pidgey", "Pidgeotto", "Pidgeot", "Rattata", "Raticate",
"Spearow", "Fearow", "Ekans", "Arbok", "Pikachu", "Raichu", "Sandshrew", "Sandslash",
"NidoranF", "Nidorina", "Nidoqueen", "NidoranM", "Nidorino", "Nidoking",
"Clefairy", "Clefable", "Vulpix", "Ninetales", "Jigglypuff", "Wigglytuff",
"Zubat", "Golbat", "Oddish", "Gloom", "Vileplume", "Paras", "Parasect", "Venonat", "Venomoth",
"Diglett", "Dugtrio", "Meowth", "Persian", "Psyduck", "Golduck", "Mankey", "Primeape",
"Growlithe", "Arcanine", "Poliwag", "Poliwhirl", "Poliwrath", "Abra", "Kadabra", "Alakazam",
"Machop", "Machoke", "Machamp", "Bellsprout", "Weepinbell", "Victreebel", "Tentacool", "Tentacruel",
"Geodude", "Graveler", "Golem", "Ponyta", "Rapidash", "Slowpoke", "Slowbro",
"Magnemite", "Magneton", "Farfetch'd", "Doduo", "Dodrio", "Seel", "Dewgong", "Grimer", "Muk",
"Shellder", "Cloyster", "Gastly", "Haunter", "Gengar", "Onix", "Drowzee", "Hypno",
"Krabby", "Kingler", "Voltorb", "Electrode", "Exeggcute", "Exeggutor", "Cubone", "Marowak",
"Hitmonlee", "Hitmonchan", "Lickitung", "Koffing", "Weezing", "Rhyhorn", "Rhydon", "Chansey",
"Tangela", "Kangaskhan", "Horsea", "Seadra", "Goldeen", "Seaking", "Staryu", "Starmie",
"Mr. Mime", "Scyther", "Jynx", "Electabuzz", "Magmar", "Pinsir", "Tauros", "Magikarp", "Gyarados",
"Lapras", "Ditto", "Eevee", "Vaporeon", "Jolteon", "Flareon", "Porygon", "Omanyte", "Omastar",
"Kabuto", "Kabutops", "Aerodactyl", "Snorlax", "Articuno", "Zapdos", "Moltres",
"Dratini", "Dragonair", "Dragonite", "Mewtwo", "Mew",
"Chikorita", "Bayleef", "Meganium", "Cyndaquil", "Quilava", "Typhlosion",
"Totodile", "Croconaw", "Feraligatr", "Sentret", "Furret", "Hoothoot", "Noctowl",
"Ledyba", "Ledian", "Spinarak", "Ariados", "Crobat", "Chinchou", "Lanturn", "Pichu", "Cleffa",
"Igglybuff", "Togepi", "Togetic", "Natu", "Xatu", "Mareep", "Flaaffy", "Ampharos", "Bellossom",
"Marill", "Azumarill", "Sudowoodo", "Politoed", "Hoppip", "Skiploom", "Jumpluff", "Aipom",
"Sunkern", "Sunflora", "Yanma", "Wooper", "Quagsire", "Espeon", "Umbreon", "Murkrow", "Slowking",
"Misdreavus", "Unown", "Wobbuffet", "Girafarig", "Pineco", "Forretress", "Dunsparce", "Gligar",
"Steelix", "Snubbull", "Granbull", "Qwilfish", "Scizor", "Shuckle", "Heracross", "Sneasel",
"Teddiursa", "Ursaring", "Slugma", "Magcargo", "Swinub", "Piloswine", "Corsola", "Remoraid", "Octillery",
"Delibird", "Mantine", "Skarmory", "Houndour", "Houndoom", "Kingdra", "Phanpy", "Donphan",
"Porygon2", "Stantler", "Smeargle", "Tyrogue", "Hitmontop", "Smoochum", "Elekid", "Magby", "Miltank",
"Blissey", "Raikou", "Entei", "Suicune", "Larvitar", "Pupitar", "Tyranitar", "Lugia", "Ho-Oh", "Celebi",
"Treecko", "Grovyle", "Sceptile", "Torchic", "Combusken", "Blaziken", "Mudkip", "Marshtomp",
"Swampert", "Poochyena", "Mightyena", "Zigzagoon", "Linoone", "Wurmple", "Silcoon", "Beautifly",
"Cascoon", "Dustox", "Lotad", "Lombre", "Ludicolo", "Seedot", "Nuzleaf", "Shiftry",
"Taillow", "Swellow", "Wingull", "Pelipper", "Ralts", "Kirlia", "Gardevoir", "Surskit",
"Masquerain", "Shroomish", "Breloom", "Slakoth", "Vigoroth", "Slaking", "Nincada", "Ninjask",
"Shedinja", "Whismur", "Loudred", "Exploud", "Makuhita", "Hariyama", "Azurill", "Nosepass",
"Skitty", "Delcatty", "Sableye", "Mawile", "Aron", "Lairon", "Aggron", "Meditite", "Medicham",
"Electrike", "Manectric", "Plusle", "Minun", "Volbeat", "Illumise", "Roselia", "Gulpin",
"Swalot", "Carvanha", "Sharpedo", "Wailmer", "Wailord", "Numel", "Camerupt", "Torkoal",
"Spoink", "Grumpig", "Spinda", "Trapinch", "Vibrava", "Flygon", "Cacnea", "Cacturne", "Swablu",
"Altaria", "Zangoose", "Seviper", "Lunatone", "Solrock", "Barboach", "Whiscash", "Corphish",
"Crawdaunt", "Baltoy", "Claydol", "Lileep", "Cradily", "Anorith", "Armaldo", "Feebas",
"Milotic", "Castform", "Kecleon", "Shuppet", "Banette", "Duskull", "Dusclops", "Tropius",
"Chimecho", "Absol", "Wynaut", "Snorunt", "Glalie", "Spheal", "Sealeo", "Walrein", "Clamperl",
"Huntail", "Gorebyss", "Relicanth", "Luvdisc", "Bagon", "Shelgon", "Salamence", "Beldum",
"Metang", "Metagross", "Regirock", "Regice", "Registeel", "Latias", "Latios", "Kyogre",
"Groudon", "Rayquaza", "Jirachi", "Deoxys",
"Turtwig", "Grotle", "Torterra", "Chimchar", "Monferno", "Infernape", "Piplup", "Prinplup",
"Empoleon", "Starly", "Staravia", "Staraptor", "Bidoof", "Bibarel", "Kricketot", "Kricketune",
"Shinx", "Luxio", "Luxray", "Budew", "Roserade", "Cranidos", "Rampardos", "Shieldon", "Bastiodon",
"Burmy", "Wormadam", "Mothim", "Combee", "Vespiquen", "Pachirisu", "Buizel", "Floatzel", "Cherubi",
"Cherrim", "Shellos", "Gastrodon", "Ambipom", "Drifloon", "Drifblim", "Buneary", "Lopunny",
"Mismagius", "Honchkrow", "Glameow", "Purugly", "Chingling", "Stunky", "Skuntank", "Bronzor",
"Bronzong", "Bonsly", "Mime Jr.", "Happiny", "Chatot", "Spiritomb", "Gible", "Gabite", "Garchomp",
"Munchlax", "Riolu", "Lucario", "Hippopotas", "Hippowdon", "Skorupi", "Drapion", "Croagunk",
"Toxicroak", "Carnivine", "Finneon", "Lumineon", "Mantyke", "Snover", "Abomasnow", "Weavile",
"Magnezone", "Lickilicky", "Rhyperior", "Tangrowth", "Electivire", "Magmortar", "Togekiss",
"Yanmega", "Leafeon", "Glaceon", "Gliscor", "Mamoswine", "Porygon-Z", "Gallade", "Probopass",
"Dusknoir", "Froslass", "Rotom", "Uxie", "Mesprit", "Azelf", "Dialga", "Palkia", "Heatran",
"Regigigas", "Giratina", "Cresselia", "Phione", "Manaphy", "Darkrai", "Shaymin", "Arceus",
}
nature = {"Hardy","Lonely(+ATK-DEF)","Brave(+ATK-SPE)","Adamant(+ATK-SAT)","Naughty(+ATK-SDF)",
"Bold(+DEF-ATK)","Docile","Relaxed(+DEF-SPE)","Impish(+DEF-SAT)","Lax(+DEF-SDF)",
"Timid(+SPE-ATK)","Hasty(+SPE-DEF)","Serious","Jolly(+SPE-SAT)","Naive(+SPE-SDF)",
"Modest(+SAT-ATK)","Mild(+SAT-DEF)","Quiet(+SAT-SPE)","Bashful","Rash(+SAT-SDF)",
"Calm(+SDF-ATK)","Gentle(+SDF-DEF)","Sassy(+SDF-SPE)","Careful(+SDF-SAT)","Quirky"}
function MethodJ(initialrng, a)
frame = getSeedDistance(initialrng)
rng2 = initialrng
rng = rngAdvance(initialrng)
slot = math.floor(gettop(rng2) / 656)
pkmstr = ""
lvlnum = 0
if land == 1 then --(Grass)
if (slot < 20) then slot = 0
elseif (slot < 40) then slot = 1
elseif (slot < 50) then slot = 2
elseif (slot < 60) then slot = 3
elseif (slot < 70) then slot = 4
elseif (slot < 80) then slot = 5
elseif (slot < 85) then slot = 6
elseif (slot < 90) then slot = 7
elseif (slot < 94) then slot = 8
elseif (slot < 98) then slot = 9
elseif (slot == 98) then slot = 10
else slot = 11
end
pkmstr = pokemonname[encslots_pkm[slot+1]+1]
lvlnum = encslots_lvl[slot+1]
else -- land == 2 (Water)
if (slot < 60) then slot = 0
elseif (slot < 90) then slot = 1
elseif (slot < 95) then slot = 2
elseif (slot < 99) then slot = 3
else slot = 4
end
pkmstr = pokemonname[waterslots_pkm[slot+1]+1]
lvlnum = gettop(rng) % (waterslots_maxlvl[slot+1] - waterslots_minlvl[slot+1] + 1) + waterslots_minlvl[slot+1]
rng = rngAdvance(rng)
frame = frame + 1
end
mynat = math.floor(gettop(rng) / 0xA3E)
loop = 0
while (true) do
rng2 = rngAdvance(rng)
rng = rngAdvance(rng2)
pid = gettop(rng)*65536 + gettop(rng2)
if (pid % 25 == mynat) then break end
end
rng = rngAdvance(rng)
IV = gettop(rng)
rng = rngAdvance(rng)
IV2 = gettop(rng)
gui.text(120,a, "F:".. frame ..
", " .. pkmstr, "#FFFFFF80")
gui.text(120,a+10, "IV: [".. IV%32 .. "," .. math.floor(IV/32)%32 .. ","
.. math.floor(IV/1024)%32 .. "," .. math.floor(IV2/32)%32 .. ","
.. math.floor(IV2/1024)%32 .. "," .. IV2%32 .. "]", "#FFFFFF80")
gui.text(120,a+20, nature[mynat+1] .. " L." .. lvlnum, "#FFFFFF80")
end
function drawGrid()
test = currentRNG
lastRNG = currentRNG
futureencs = {}
futureencs_n = 0
gui.box(3,3,103,79,"#AAAAAAA0", "white")
if bottommenu_mode == 1 then
for i = 0, 11, 1 do
for j = 0, 15, 1 do
clr = "#000000FF" -- init square color to black
if j % 4 == 0 then
clr = "#404040FF"
end
randvalue = gettop(test)
if randvalue % 16 == 0 then
if randvalue % 100 >= 95 then
clr = "magenta"
else
clr = "red"
end
--elseif randvalue % 16 <2 then
--clr = "green"
else
if randvalue % 100 >= 95 then
clr = "blue"
end
end
drawsquare(6+6*j,6+6*i, clr)
test=rngAdvance(test)
end
end
drawarrowdown(8,6, "red")
drawarrowdown(26,6, "red")
drawarrowdown(44,6, "blue")
else
for i = 0, 11, 1 do
for j = 0, 15, 1 do
clr = "#000000FF" -- init square color to black
randvalue = gettop(test)
test2 = test
if (stepcounter >= maxstepcounter) or (encrate_mode > 1) or (randvalue / 0x290 < 5) then
if (stepcounter < maxstepcounter and encrate_mode == 1) then
clr = "#666666FF"
test2=rngAdvance(test2)
randvalue=gettop(test2)
end
if (randvalue / 0x290 < movement_rate) then
clr = "#666666FF"
test2=rngAdvance(test2)
randvalue=gettop(test2)
if (randvalue / 0x290 < encrate) then
clr = "#FF0000FF"
if futureencs_n < 10 then
futureencs[futureencs_n] = rngAdvance(test2)
futureencs_n = futureencs_n + 1
end
end
end
end
drawsquare(6+6*j,6+6*i, clr)
test=rngAdvance(test)
end
end
end
end
function fn()
gameIDAddr = memory.readdword(0x23FFE0C)
if gameIDAddr == 0x45415041 then
game = 1
gamename = "Pearl (U)"
elseif gameIDAddr == 0x45414441 then
game = 1
gamename = "Diamond (U)"
elseif gameIDAddr == 0x45555043 then
game = 2
gamename = "Platinum (U)"
elseif gameIDAddr == 0x4A415041 then
game = 3
gamename = "Pearl (J)"
elseif gameIDAddr == 0x4A414441 then
game = 3
gamename = "Diamond (J)"
else
game = -1
gamename = "Invalid game"
end
gui.box(0,-192,256,-181,"#00000080")
gui.box(0,0,256,192,"#000000A0")
gui.text(0,-190,"Game: " .. gamename,"#FFFFFFB0")
gui.text(140,-190,"Test seed: " .. bit.tohex(testingseed_forRNG),"#FFFFFFB0")
if game == -1 then
return
end
pointer = memory.readdword(pointerAddr[game])
stepcounter = memory.readbyte(pointer + stepcounterAddrOffset[game])
stepcnt128 = memory.readbyte(pointer + stepcnt128AddrOffset[game])
UpdateTab()
ModeHandler()
currentRNG = memory.readdword(RNGAddr[game])
nextRNG = rngAdvance(currentRNG)
test = lastRNG
for i = 0, 150, 1 do
if bit.tohex(currentRNG)==bit.tohex(test) then
gui.text(0,113,"Dist last: "..i, "#FFFF00A0")
break
elseif i >= 150 then
gui.text(0,113,"Dist last: >150", "#FFFF00A0")
break
end
test=rngAdvance(test)
end
gui.text(0,83,"Curr RNG: "..bit.tohex(currentRNG), "#FFFF00A0")
gui.text(0,93,"Next RNG: "..bit.tohex(nextRNG), "#FFFF00A0")
gui.text(0,103, "Step Cnt (128): ".. stepcnt128, "#FFFF00A0")
distanceseed = getSeedDistance(currentRNG)
gui.text(0,123,"Dist seed: " .. distanceseed, "#FFFF00A0")
gui.text(0,133, "Enc. Rate Cnt: ".. stepcounter .. "/".. maxstepcounter, "#FFFF00A0")
hour = memory.readdword(clockAddr[game])
gui.text(0,143, "Clock: "
.. hour .. ":"
.. memory.readdword(clockAddr[game]+4) .. ":"
.. memory.readdword(clockAddr[game]+8)
, "#FFFF00A0")
gui.text(0,153, "IGT: "
.. memory.readbyte(pointer + IGTAddrOffset[game]) .. ":"
.. memory.readbyte(pointer + IGTAddrOffset[game]+2) .. ":"
.. memory.readbyte(pointer + IGTAddrOffset[game]+3)
, "#FFFF00A0")
gui.text(0,163, "IG Framecount: " .. memory.readdword(framecountAddr[game]), "#FFFF00A0")
-- Enc Slots
fillEncSlots()
-- Point Grid
drawGrid()
gui.box(2,177,93,189,"#00000080","#FFFFFFFF")
drawarrowleft(5,180,"#FFFFFFFF")
gui.text(20,180, bottommenu_str[bottommenu_mode], "#FFFFFFFF")
drawarrowright(90,180,"#FFFFFFFF")
if bottommenu_mode == 2 then
gui.text(50, -170, "Stationary:", "#FFFFFF80")
MethodJ(currentRNG,-170)
gui.text(86, -137, "Wild:", "#FFFFFF80")
for i = 0, futureencs_n-1, 1 do
MethodJ(futureencs[i],-170 + 33*(i+1))
end
elseif bottommenu_mode == 3 then
gui.text(115,5, "Encounter slots (" .. landstr[land] .. ")", "#00FF00FF")
if land == 1 then -- (Grass)
for i = 1, 12, 1 do
gui.text(115, (i+1)*10, i-1 .. " - " .. pokemonname[encslots_pkm[i]+1] .. " L." .. encslots_lvl[i])
end
else --land == 2 (Water)
for i = 1, 5, 1 do
gui.text(115, (i+1)*10, i-1 .. " - " .. pokemonname[waterslots_pkm[i]+1] .. " L." .. waterslots_minlvl[i] .. "-" .. waterslots_maxlvl[i])
end
end
elseif bottommenu_mode == 4 then
gui.text(115,5, "Misc. Data", "#00FF00FF")
gui.text(115,20, "Trainer ID: " .. memory.readword(pointer + TIDAddrOffset[game]))
gui.text(115,30, "Secret ID: " .. memory.readword(pointer + TIDAddrOffset[game]+2))
gui.text(115,40, "Lottery ID: " .. memory.readword(pointer + LIDAddrOffset[game]))
end
end
gui.register(fn)