I'm selecting out things that make sense to read in real-time. Fiddly numbers like when item drops happen is difficult to display appropriately in real-time.
Currently shows barrier, weapons, and size of current segment. I hope it's pretty.
--GBA Zook Man ZX4 - Casual Display script
--The display is intended to make sense for real-time viewing.
--For BizHawk
--FatRatKnight
local R4u,R4s= memory.read_u32_le,memory.read_s32_le
local R2u,R2s= memory.read_u16_le,memory.read_s16_le
local R1u,R1s= memory.read_u8 ,memory.read_s8
--Would stick function inside function. BizHawk seems to hate it.
local function BoxB(x,y,i,bc,fc) gui.drawRectangle(x-1+5*i,y+7,3,3,bc,fc) end
--*****************************************************************************
local function BarrierDisplay(x,y)
--*****************************************************************************
--37x16 - Displays barrier information in a pretty fashion.
--Squares for each HP. Changes color and shows a timer if barrier is hit.
local BarrierHP = R4u(0x16B4,"IWRAM")
local BarrierTmr= R4u(0x16B8,"IWRAM")
local clr= 0xFF808080
if BarrierHP > 0 then
clr= 0xFF00FFFF
if BarrierTmr > 0 then
BoxB(x,y,BarrierHP,0xFFFF8000,0xFFFFFF00)
local X,Y= x+6,y+13
gui.drawLine( X,Y,X+math.floor((BarrierTmr-1)/2),Y,0xFFFFFF00)
gui.drawPixel(X,Y,0xFFFFFF00) --Because line doesn't draw coord1==coord2
BarrierHP= BarrierHP-1
end
for i= 1, BarrierHP do
BoxB(x,y,i,0xFF0080FF,0xFF0080FF)
end
end
gui.pixelText(x+ 4,y ,"Barrier",clr)
gui.drawLine( x ,y ,x ,y+15,clr)
gui.drawLine( x+ 1,y+15,x+35,y+15,clr)
gui.drawLine( x+36,y ,x+36,y+15,clr)
end
local WpnClr= {
0xFFFF2000, --Flame
0xFF00FF00, --Whirlwind
0xFFC08000, --Dirt
0xFF0040FF, --Bubble
0xFFC0FFFF, --Missile
0xFFFFFF00, --Star
0xFFFF00FF, --Spikeball
0xFF00FFFF --Laser
}
local function BoxW(x,y,bc,fc) gui.drawRectangle(x,y,6,24,bc,fc) end
--*****************************************************************************
local function WeaponDisplay(x,y,w)
--*****************************************************************************
--6x24 - For a single weapon. Will display negative ammo as well.
local HaveWpn= R1u(0x1668+w,"IWRAM") ~= 0
if not HaveWpn then BoxW(x,y,0xFF606060,0); return end
local clr= WpnClr[w] or 0xFFFFFFFF
local WpnSelect= R4u(0x15E4,"IWRAM")
if WpnSelect == w then
local FlashingClr= 0xFF008000 + 0x00FF7FFF * (math.floor(emu.framecount()/2)%2)
BoxW(x,y,FlashingClr,0)
else
BoxW(x,y,clr,0)
end
local WpnAmmo= R1s(0x165C+w,"IWRAM")
if WpnAmmo < 0 then
WpnAmmo= -WpnAmmo
for i= 1, WpnAmmo do
local X,Y= x+2,y+2*i
gui.drawPixel(X ,Y,0xFFFF0000)
gui.drawPixel(X+2,Y,0xFFFF0000)
end
else
for i= 1, WpnAmmo do
local X,Y= x+2,y+24-2*i
gui.drawLine(X,Y,X+2,Y,clr)
end
end
end
--*****************************************************************************
local function ChargeDisplay(x,y)
--*****************************************************************************
--4x40 - Vertical charge display
local Charge= R1s(0x1608,"IWRAM")
local WpnSelect= R4u(0x15E4,"IWRAM")
local ArmUpgrade=R1u(0x1650,"IWRAM") ~= 0
end
--*****************************************************************************
local function BossDisplay(x,y)
--*****************************************************************************
end
--*****************************************************************************
local function MinibossDisplay(x,y)
--*****************************************************************************
end
--*****************************************************************************
local function MapDisplay(x,y)
--*****************************************************************************
--38x?? - Intended to be... Really basic. We only have 40 pixels width.
--Segments are as wide as 18 blocks. We ain't got a lot o' room.
local Width= R4u(0x153C,"IWRAM")
local Height= R4u(0x1540,"IWRAM")
if Width > 18 then return end --Panic
gui.drawRectangle(x,y,Width*2+1,Height*2+1,0xFFC0C0C0,0)
end
client.SetGameExtraPadding(0,0,40,0)
--*****************************************************************************
while true do
--*****************************************************************************
--Our overhead.
BarrierDisplay(242,2)
for i= 1, 8 do
local X= 245+((i-1)%4)*9
local Y= 20 + math.floor((i-1)/4)*27
WeaponDisplay(X,Y,i)
end
ChargeDisplay(241,20)
-- if not boss then
local Segment= R4u(0x1530,"IWRAM")
gui.pixelText(241,120,"Map " .. Segment)
MapDisplay(241,128)
-- end
emu.frameadvance()
end