User File #45193133605920554

Upload All User Files

#45193133605920554 - Pokemon DPPt RNG lua 2.3

pearl_plat_rng_v2_3.lua
1213 downloads
Uploaded 2/17/2018 6:26 AM by Fortranm (see all 102)
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)