User File #45104458121099441

Upload All User Files

#45104458121099441 - Pokemon DS games lua with autodetection

gen4_and_5_pokemon.lua
757 downloads
Uploaded 2/13/2018 6:35 AM by Fortranm (see all 96)
I added auto-detection function and Japanese D/P support to MKDasher's Pokemon data lua as well.
-- Pokemon gen 4 lua script by MKDasher
-- Japanese Diamond/Pearl support and auto-detection added by Fortranm
-----------
	-- Press 3 - 4 to change mode (Party / Enemy / Enemy 2 / Partner / Wild)
	-- Press 7 - 8 to change number slot.
	-- Press 9 to change view.
	local game = 1 -- 1 = D/P(U), 2 = HG/SS, 3 = Platinum, 4 = Black, 5 = White, 6 = Black 2, 7 = White 2, 8 = D/P(J)
-----------

local gen

local pointer
local pidAddr
local pid = 0
local trainerID, secretID, lotteryID
local shiftvalue
local checksum = 0

local mode = 1
local modetext = "Party"
local submode = 1
local modemax = 5
local submodemax = 6
local tabl = {}
local prev = {}

local leftarrow1color, rightarrow1color, leftarrow2color, rightarrow2color

local prng

--BlockA
local pokemonID = 0
local heldItem = 0
local OTID, OTSID
local friendship_or_steps_to_hatch
local ability
local hpev, atkev, defev, speev, spaev, spdev
local evs = {}

--BlockB
local move = {}
local movepp = {}
local hpiv, atkiv, defiv, speiv, spaiv, spdiv
local ivspart = {}, ivs
local isegg
local nat

local bnd,br,bxr=bit.band,bit.bor,bit.bxor
local rshift, lshift=bit.rshift, bit.lshift
local mdword=memory.readdwordunsigned
local mword=memory.readwordunsigned
local mbyte=memory.readbyteunsigned

--BlockD
local pkrs

--currentStats
local level, hpstat, maxhpstat, atkstat, defstat, spestat, spastat, spdstat
local currentFoeHP = 0

local hiddentype, hiddenpower

--offsets
local BlockAoff, BlockBoff, BlockCoff, BlockDoff

dofile "gen4_and_5_pokemon_extension.lua"

local xfix = 10
local yfix = 10
function displaybox(a,b,c,d,e,f)
	gui.box(a+xfix,b+yfix,c+xfix,d+yfix,e,f)
end

function display(a,b,c,d)
	gui.text(xfix+a,yfix+b,c, d)
end

function drawarrowleft(a,b,c)
 gui.line(a+xfix,b+yfix+3,a+2+xfix,b+5+yfix,c)
 gui.line(a+xfix,b+yfix+3,a+2+xfix,b+1+yfix,c)
 gui.line(a+xfix,b+yfix+3,a+6+xfix,b+3+yfix,c)
end

function drawarrowright(a,b,c)
 gui.line(a+xfix,b+yfix+3,a-2+xfix,b+5+yfix,c)
 gui.line(a+xfix,b+yfix+3,a-2+xfix,b+1+yfix,c)
 gui.line(a+xfix,b+yfix+3,a-6+xfix,b+3+yfix,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 getbits(a,b,d)
	return rshift(a,b)%lshift(1,d)
end

function gettop(a)
	return(rshift(a,16))
end

function menu()
	tabl = input.get()
	leftarrow1color = "white"
	leftarrow2color = "white"
	rightarrow1color = "white"
	rightarrow2color = "white"
	if tabl["7"] then
		leftarrow2color = "yellow"
	end
	if tabl["8"] then
		rightarrow2color = "yellow"
	end
	if tabl["3"] then
		leftarrow1color = "yellow"
	end
	if tabl["4"] then
		rightarrow1color = "yellow"
	end
	if tabl["7"] and not prev["7"] and mode < 5 then
		submode = submode - 1
		if submode == 0 then
			submode = submodemax
		end
	end
	if tabl["8"] and not prev["8"] and mode < 5 then
		submode = submode + 1
		if submode == submodemax + 1 then
			submode = 1
		end
	end
	if tabl["3"] and not prev["3"] then
		mode = mode - 1
		if mode == 0 then
			mode = modemax
		end
	end
	if tabl["4"] and not prev["4"] then
		mode = mode + 1
		if mode == modemax + 1 then
			mode = 1
		end
	end
	if tabl["0"] and not prev["0"] then
		if yfix == 10 then
			yfix = -185
		else
			yfix = 10
		end
	end
	prev = tabl
	if mode == 1 then
		modetext = "Party"
	elseif mode == 2 then
		modetext = "Enemy"
	elseif mode == 3 then
		modetext = "Enemy 2"
	elseif mode == 4 then
		modetext = "Partner"
	else -- mode == 5
		modetext = "Wild"
	end
end

function getGame()
	gameIDAddr = memory.readdword(0x23FFE0C)
	if gameIDAddr == 0x45415041 or gameIDAddr == 0x45414441 then --D/P(U)
		game = 1
	elseif gameIDAddr == 0x4A415041 or gameIDAddr == 0x4A414441 then --D/P(J)
		game = 8
	elseif gameIDAddr == 0x45555043 then --Platinum
		game = 3
	elseif gameIDAddr == 0x454B5049 or gameIDAddr == 0x45475049 then --HG/SS
		game = 2
	elseif gameIDAddr == 0x4F425249 then --Black
		game = 4
	elseif gameIDAddr == 0x4F415249 then --White
		game = 5
	elseif gameIDAddr == 0x4F455249 then --Black 2
		game = 6
	elseif gameIDAddr == 0x4F445249 then --White 2
		game = 7
	else
		game = -1
	end
end

function getGen()
	if game < 4 or game == 8 then
		return 4
	else
		return 5
	end
end

function getGameName()
	if game == 1 then
		return "D/P(U)"
	elseif game == 2 then
		return "HG/SS"
	elseif game == 3 then
		return "Platinum"
	elseif game == 4 then
		return "Black"
	elseif game == 5 then
		return "White"
	elseif game == 6 then
		return "Black 2"
	elseif game == 7 then
		return "White 2"
	elseif game == 8 then
		return "D/P(J)"
	else
		return "Invalid"
	end
end

function getPointer()
	if game == 1 then
		return memory.readdword(0x02106FAC)
	elseif game == 2 then
		return memory.readdword(0x0211186C)
	elseif game == 3 then
		return memory.readdword(0x02101D2C)
	else -- game == 8
		return memory.readdword(0x02108804)
	end
	-- haven't found pointers for BW/B2W2, probably not needed anyway.
end

function getCurFoeHP()
	if game == 1 or game == 8 then -- Pearl
		if mode == 4 then -- Partner's hp
			return memory.readword(pointer + 0x5574C)
		elseif mode == 3 then -- Enemy 2
			return memory.readword(pointer + 0x5580C)
		else
			return memory.readword(pointer + 0x5568C)
		end
	elseif game == 2 then --Heartgold
		if mode == 4 then -- Partner's hp
			return memory.readword(pointer + 0x56FC0)
		elseif mode == 3 then -- Enemy 2
			return memory.readword(pointer + 0x57080)
		else
			return memory.readword(pointer + 0x56F00)
		end
	else--if game == 3 then --Platinum
		if mode == 4 then -- Partner's hp
			return memory.readword(pointer + 0x54764)
		elseif mode == 3 then -- Enemy 2
			return memory.readword(pointer + 0x54824)
		else
			return memory.readword(pointer + 0x546A4)
		end
	end
end

function getPidAddr()
	if game == 1 or game == 8 then --Pearl
		enemyAddr = pointer + 0x364C8
		if mode == 5 then
			return pointer + 0x36C6C
		elseif mode == 4 then
			return memory.readdword(enemyAddr) + 0x774 + 0x5B0 + 0xEC*(submode-1)
		elseif mode == 3 then
			return memory.readdword(enemyAddr) + 0x774 + 0xB60 + 0xEC*(submode-1)
		elseif mode == 2 then
			return memory.readdword(enemyAddr) + 0x774 + 0xEC*(submode-1)
		else
			return pointer + 0xD2AC + 0xEC*(submode-1)
		end
	elseif game == 2 then --HeartGold
		enemyAddr = pointer + 0x37970
		if mode == 5 then
			return pointer + 0x38540
		elseif mode == 4 then
			return memory.readdword(enemyAddr) + 0x1C70 + 0xA1C + 0xEC*(submode-1)	
		elseif mode == 3 then
			return memory.readdword(enemyAddr) + 0x1C70 + 0x1438 + 0xEC*(submode-1)
		elseif mode == 2 then
			return memory.readdword(enemyAddr) + 0x1C70 + 0xEC*(submode-1)
		else
			return pointer + 0xD088 + 0xEC*(submode-1)
		end
	elseif game == 3 then --Platinum
		enemyAddr = pointer + 0x352F4
		if mode == 5 then
			return pointer + 0x35AC4
		elseif mode == 4 then
			return memory.readdword(enemyAddr) + 0x7A0 + 0x5B0 + 0xEC*(submode-1)
		elseif mode == 3 then
			return memory.readdword(enemyAddr) + 0x7A0 + 0xB60 + 0xEC*(submode-1) 
		elseif mode == 2 then
			return memory.readdword(enemyAddr) + 0x7A0 + 0xEC*(submode-1) 
		else
			return pointer + 0xD094 + 0xEC*(submode-1)
		end
	elseif game == 4 then --Black
		if mode == 5 then
			return 0x02259DD8
		elseif mode == 4 then
			return 0x0226B7B4 + 0xDC*(submode-1)
		elseif mode == 3 then
			return 0x0226C274 + 0xDC*(submode-1)
		elseif mode == 2 then
			return 0x0226ACF4 + 0xDC*(submode-1)
		else -- mode 1
			return 0x022349B4 + 0xDC*(submode-1) 
		end
	elseif game == 5 then --White
		if mode == 5 then
			return 0x02259DF8
		elseif mode == 4 then
			return 0x0226B7D4 + 0xDC*(submode-1)
		elseif mode == 3 then
			return 0x0226C294 + 0xDC*(submode-1)	
		elseif mode == 2 then
			return 0x0226AD14 + 0xDC*(submode-1)
		else -- mode 1
			return 0x022349D4 + 0xDC*(submode-1) 
		end
	elseif game == 6 then --Black 2
		if mode == 5 then
			return 0x0224795C
		elseif mode == 4 then
			return 0x022592F4 + 0xDC*(submode-1)
		elseif mode == 3 then
			return 0x02259DB4 + 0xDC*(submode-1)			
		elseif mode == 2 then
			return 0x02258834 + 0xDC*(submode-1)
		else -- mode 1
			return 0x0221E3EC + 0xDC*(submode-1)
		end
	else --White 2
		if mode == 5 then
			return 0x0224799C
		elseif mode == 4 then
			return 0x02259334 + 0xDC*(submode-1)
		elseif mode == 3 then
			return 0x02259DF4 + 0xDC*(submode-1)
		elseif mode == 2 then
			return 0x02258874 + 0xDC*(submode-1)
		else -- mode 1
			return 0x0221E42C + 0xDC*(submode-1)
		end
	end
end

function getNatClr(a)
	color = "yellow"
	if nat % 6 == 0 then
		color = "yellow"
	elseif a == "atk" then
		if nat < 5 then
			color = "#0080FFFF"
		elseif nat % 5 == 0 then
			color = "red"
		end
	elseif a == "def" then
		if nat > 4 and nat < 10 then
			color = "#0080FFFF"
		elseif nat % 5 == 1 then
			color = "red"
		end
	elseif a == "spe" then
		if nat > 9 and nat < 15 then
			color = "#0080FFFF"
		elseif nat % 5 == 2 then
			color = "red"
		end
	elseif a == "spa" then
		if nat > 14 and nat < 20 then
			color = "#0080FFFF"
		elseif nat % 5 == 3 then
			color = "red"
		end
	elseif a == "spd" then
		if nat > 19 then
			color = "#0080FFFF"
		elseif nat % 5 == 4 then
			color = "red"
		end
	end
	return color
end
 
function fn()
	menu()
	getGame()
	gen = getGen()
	pointer = getPointer()
	pidAddr = getPidAddr()
	pid = memory.readdword(pidAddr)
	--trainerID = memory.readword(pointer + 0xD064) HeartGold only?
	--secretID = memory.readword(pointer + 0xD066) HeartGold only?
	--lotteryID = memory.readword(pointer + 0xDE4C) HeartGold only?
	checksum = memory.readword(pidAddr + 6)
	shiftvalue = (rshift((bnd(pid,0x3E000)),0xD)) % 24
	
	BlockAoff = (BlockA[shiftvalue + 1] - 1) * 32
	BlockBoff = (BlockB[shiftvalue + 1] - 1) * 32
	BlockCoff = (BlockC[shiftvalue + 1] - 1) * 32
	BlockDoff = (BlockD[shiftvalue + 1] - 1) * 32
	
	-- Block A
	prng = checksum
	for i = 1, BlockA[shiftvalue + 1] - 1 do
		prng = mult32(prng,0x5F748241) + 0xCBA72510 -- 16 cycles
	end
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	pokemonID = bxr(memory.readword(pidAddr + BlockAoff + 8), gettop(prng))
	if gen == 4 and pokemonID > 494 then --just to make sure pokemonID is right (gen 4)
		pokemonID = -1 -- (pokemonID = -1 indicates invalid data)
	elseif gen == 5 and pokemonID > 651 then -- gen5
		pokemonID = -1 -- (pokemonID = -1 indicates invalid data)
	end
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	heldItem = bxr(memory.readword(pidAddr + BlockAoff + 2 + 8), gettop(prng))
	if gen == 4 and heldItem > 537 then -- Gen 4
		pokemonID = -1 -- (pokemonID = -1 indicates invalid data)
	elseif gen == 5 and heldItem > 639 then -- Gen 5
		pokemonID = -1 -- (pokemonID = -1 indicates invalid data)
	end
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	OTID = bxr(memory.readword(pidAddr + BlockAoff + 4 + 8), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	OTSID = bxr(memory.readword(pidAddr + BlockAoff + 6 + 8), gettop(prng))
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	ability = bxr(memory.readword(pidAddr + BlockAoff + 12 + 8), gettop(prng))
	friendship_or_steps_to_hatch = getbits(ability, 0, 8)
	ability = getbits(ability, 8, 8)
	if gen == 4 and ability > 123 then
		pokemonID = -1 -- (pokemonID = -1 indicates invalid data)
	elseif gen == 5 and ability > 164 then
		pokemonID = -1
	end
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	evs[1] = bxr(memory.readword(pidAddr + BlockAoff + 16 + 8), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	evs[2] = bxr(memory.readword(pidAddr + BlockAoff + 18 + 8), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	evs[3] = bxr(memory.readword(pidAddr + BlockAoff + 20 + 8), gettop(prng))
	
	hpev =  getbits(evs[1], 0, 8)
	atkev = getbits(evs[1], 8, 8)
	defev = getbits(evs[2], 0, 8)
	speev = getbits(evs[2], 8, 8)
	spaev = getbits(evs[3], 0, 8)
	spdev = getbits(evs[3], 8, 8)
	
	-- Block B
	prng = checksum
	for i = 1, BlockB[shiftvalue + 1] - 1 do
		prng = mult32(prng,0x5F748241) + 0xCBA72510 -- 16 cycles
	end
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	move[1] = bxr(memory.readword(pidAddr + BlockBoff + 8), gettop(prng))
	if gen == 4 and move[1] > 467 then
		pokemonID = -1
	elseif gen == 5 and move[1] > 559 then
		pokemonID = -1
	end
	prng = mult32(prng,0x41C64E6D) + 0x6073
	move[2] = bxr(memory.readword(pidAddr + BlockBoff + 2 + 8), gettop(prng))
	if gen == 4 and move[2] > 467 then
		pokemonID = -1
	elseif gen == 5 and move[2] > 559 then
		pokemonID = -1
	end
	prng = mult32(prng,0x41C64E6D) + 0x6073
	move[3] = bxr(memory.readword(pidAddr + BlockBoff + 4 + 8), gettop(prng))
	if gen == 4 and move[3] > 467 then
		pokemonID = -1
	elseif gen == 5 and move[3] > 559 then
		pokemonID = -1
	end
	prng = mult32(prng,0x41C64E6D) + 0x6073
	move[4] = bxr(memory.readword(pidAddr + BlockBoff + 6 + 8), gettop(prng))
	if gen == 4 and move[4] > 467 then
		pokemonID = -1
	elseif gen == 5 and move[4] > 559 then
		pokemonID = -1
	end
	prng = mult32(prng,0x41C64E6D) + 0x6073
	moveppaux = bxr(memory.readword(pidAddr + BlockBoff + 8 + 8), gettop(prng))
	movepp[1] = getbits(moveppaux,0,8)
	movepp[2] = getbits(moveppaux,8,8)
	prng = mult32(prng,0x41C64E6D) + 0x6073
	moveppaux = bxr(memory.readword(pidAddr + BlockBoff + 10 + 8), gettop(prng))
	movepp[3] = getbits(moveppaux,0,8)
	movepp[4] = getbits(moveppaux,8,8)
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	
	prng = mult32(prng,0x41C64E6D) + 0x6073
	ivspart[1] = bxr(memory.readword(pidAddr + BlockBoff + 16 + 8), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	ivspart[2] = bxr(memory.readword(pidAddr + BlockBoff + 18 + 8), gettop(prng))
	ivs = ivspart[1]  + lshift(ivspart[2],16)
	
	hpiv  = getbits(ivs,0,5)
    atkiv = getbits(ivs,5,5)
	defiv = getbits(ivs,10,5)
	speiv = getbits(ivs,15,5)
	spaiv = getbits(ivs,20,5)
	spdiv = getbits(ivs,25,5)
	isegg = getbits(ivs,30,1)
	
	-- Nature for gen 5, for gen 4, it's calculated from the PID.
	if gen == 5 then
		prng = mult32(prng,0x41C64E6D) + 0x6073
		prng = mult32(prng,0x41C64E6D) + 0x6073
		prng = mult32(prng,0x41C64E6D) + 0x6073
		nat = bxr(memory.readword(pidAddr + BlockBoff + 24 + 8), gettop(prng))
		nat = getbits(nat,8,8)
		if nat > 24 then
			pokemonID = -1
		end
	else -- gen == 4
		nat = pid % 25
	end
	
	-- Block D
	prng = checksum
	for i = 1, BlockD[shiftvalue + 1] - 1 do
		prng = mult32(prng,0x5F748241) + 0xCBA72510 -- 16 cycles
	end
	
	prng = mult32(prng,0xCFDDDF21) + 0x67DBB608 -- 8 cycles
	prng = mult32(prng,0xEE067F11) + 0x31B0DDE4 -- 4 cycles
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	pkrs = bxr(memory.readword(pidAddr + BlockDoff + 0x1A + 8), gettop(prng))
	pkrs = getbits(pkrs,0,8)
	
	-- Current stats
	prng = pid
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	prng = mult32(prng,0x41C64E6D) + 0x6073
	level = getbits(bxr(memory.readword(pidAddr + 0x8C), gettop(prng)),0,8)
	prng = mult32(prng,0x41C64E6D) + 0x6073
	hpstat = bxr(memory.readword(pidAddr + 0x8E), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	maxhpstat = bxr(memory.readword(pidAddr + 0x90), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	atkstat = bxr(memory.readword(pidAddr + 0x92), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	defstat = bxr(memory.readword(pidAddr + 0x94), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	spestat = bxr(memory.readword(pidAddr + 0x96), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	spastat = bxr(memory.readword(pidAddr + 0x98), gettop(prng))
	prng = mult32(prng,0x41C64E6D) + 0x6073
	spdstat = bxr(memory.readword(pidAddr + 0x9A), gettop(prng))
	
	currentFoeHP = getCurFoeHP()
	if currentFoeHP > 1000 then
		currentFoeHP = 0
	end
	
	-- Calculate Hidden Power
	hiddentype = math.floor(((hpiv % 2) + 2*(atkiv % 2) + 4*(defiv % 2) + 8*(speiv % 2) + 16*(spaiv % 2) + 32*(spdiv % 2))*15 / 63)
	hiddenpower = 30 + math.floor(((rshift(hpiv,1) % 2) + 2*(rshift(atkiv,1) % 2) + 4*(rshift(defiv,1) % 2)
					+ 8*(rshift(speiv,1) % 2) + 16*(rshift(spaiv,1) % 2) + 32*(rshift(spdiv,1) % 2)) * 40 / 63)
	
	-- Display data
	displaybox(-5,-5,240,175,"#000000A0", "white")
	
	display(180,0, getGameName(), "#FF88FFFF")
	display(182,10, "mode", "#FF88FFFF")
	
	drawarrowleft(98 - math.floor(string.len(modetext)/2) * 6,0, leftarrow1color)
	display(112 - math.floor(string.len(modetext)/2) * 6,0, modetext)
	drawarrowright(133 + math.floor(string.len(modetext)/2) * 6,0, rightarrow1color)
	if (mode < 5) then
		drawarrowleft(100,10, leftarrow2color)
		display(100,10, "  " .. submode)
		drawarrowright(130,10, rightarrow2color)
	end
	--display(0,0, bit.tohex(pointer))
	if pokemonID == -1 then
		display(55,30, "Invalid Pokemon Data", "red")
	else
		if isegg == 1 then
			display(0,25, "Pokemon: " .. pokemon[pokemonID + 1] .. " egg", "yellow")
		else
			display(0,25, "Pokemon: " .. pokemon[pokemonID + 1], "yellow")
		end
		display(0,35, "PID : " .. bit.tohex(pid), "magenta")
		if gen == 4 then
			display(0,45, "Item: " .. item_gen4[heldItem + 1], "white")
		else -- Gen 5
			display(0,45, "Item: " .. item_gen5[heldItem + 1], "white")
		end
		display(0,55, "OT  ID: " .. OTID, "orange")
		display(0,65, "OT SID: " .. OTSID, "cyan")
		display(0,75, "Nature: " .. nature[nat + 1], "teal")
		display(0,85, "Ability: " .. abilities[ability + 1])
		
		display(140,30, "Level: " .. level, "green")
		--Current foe is not available for gen 5 yet.
		if mode == 1 then
			display(140,40, "HP: " .. hpstat .. "/" .. maxhpstat, "green")
		elseif mode == 4 and gen == 4 then --Partner
			display(105,165, "Cur. partner's HP: " .. currentFoeHP, "green")
		elseif gen == 4 then --Enemy / Enemy 2 / Wild
			display(110,165, "Current foe's HP: " .. currentFoeHP, "green")
		
		end
		if pkrs == 0 then
			display(140,50, "PKRS: no", "red")
		else
			display(140,50, "PKRS: yes (" .. pkrs .. ")", "red")
		end
		display(140,60, "Hidden Power: ", "cyan")
		display(140,70, pkmntype[hiddentype+1] .. " " .. hiddenpower, "cyan")
		if isegg == 0 then
			display(140,80, "Friendship: " .. friendship_or_steps_to_hatch, "orange")
		else
			display(140,80, "Steps to hatch: ", "orange")
			display(140,90, friendship_or_steps_to_hatch * 256 .. "-" .. (friendship_or_steps_to_hatch + 1) * 256 .. " steps", "orange")
		end
		
		display(0,115, "HP", "yellow")
		display(0,125,"ATK", getNatClr("atk"))
		display(0,135,"DEF", getNatClr("def"))
		display(0,145,"SAT", getNatClr("spa"))
		display(0,155,"SDF", getNatClr("spd"))
		display(0,165,"SPE", getNatClr("spe"))

		display(30,105, "IV", "white")
		display(30,115, hpiv, "yellow")
		display(30,125, atkiv, getNatClr("atk"))
		display(30,135, defiv, getNatClr("def"))
		display(30,145, spaiv, getNatClr("spa"))
		display(30,155, spdiv, getNatClr("spd"))
		display(30,165, speiv, getNatClr("spe"))
		
		display(55,105, "EV", "white")
		display(55,115, hpev, "yellow")
		display(55,125, atkev, getNatClr("atk"))
		display(55,135, defev, getNatClr("def"))
		display(55,145, spaev, getNatClr("spa"))
		display(55,155, spdev, getNatClr("spd"))
		display(55,165, speev, getNatClr("spe"))
		
		display(80,105, "STAT", "white")
		display(80,115, maxhpstat, "yellow")
		display(80,125, atkstat, getNatClr("atk"))
		display(80,135, defstat, getNatClr("def"))
		display(80,145, spastat, getNatClr("spa"))
		display(80,155, spdstat, getNatClr("spd"))
		display(80,165, spestat, getNatClr("spe"))
		
		display(110,105, "  MOVES", "white")
		display(110,115,  "1.".. movename[move[1] + 1], "yellow")
		display(110,125, "2.".. movename[move[2] + 1], "yellow")
		display(110,135, "3.".. movename[move[3] + 1], "yellow")
		display(110,145, "4.".. movename[move[4] + 1], "yellow")
		
		display(210,105,  "PP", "white")
		display(210,115, movepp[1], "yellow")
		display(210,125, movepp[2], "yellow")
		display(210,135, movepp[3], "yellow")
		display(210,145, movepp[4], "yellow")
	end
end

gui.register(fn)