fceux/output/luaScripts/Sprites.lua

66 lines
2.9 KiB
Lua

-- Sprite visualizer
--
-- Draws a box around all sprites on screen,
-- hover with the mouse to inspect data.
--
-- Original by tokumaru 2016-10-08:
-- https://forums.nesdev.com/viewtopic.php?p=181008#p181008
numSpriteHeight = 8
strFillColor = "#ffffff3f"
strOutlineColor = "#ff0000bf"
strHighlightColor = "#ffffffbf"
function readSpriteAttributes(a,s,v)
local numAddress = v * 256
tabSpriteAttributes = {}
for numIndex = 0, 255 do
table.insert(tabSpriteAttributes, memory.readbyte(numAddress + numIndex))
end
end
function setSpriteHeight(a,s,v)
if AND(a, 7) == 0 then
numSpriteHeight = AND((v / 4), 8) + 8
end
end
function drawBoxes()
local tabInput, numSpriteX, numSpriteY, numDetailsBase, numTextY = input.read()
if tabSpriteAttributes ~= nill then
for numBase = 252, 0, -4 do
numSpriteX0 = tabSpriteAttributes[numBase + 4]
numSpriteY0 = tabSpriteAttributes[numBase + 1] + 1
numSpriteX1 = numSpriteX0 + 7
numSpriteY1 = numSpriteY0 + numSpriteHeight - 1
if (tabInput.xmouse >= numSpriteX0) and (tabInput.xmouse <= numSpriteX1) and (tabInput.ymouse >= numSpriteY0) and (tabInput.ymouse <= numSpriteY1) then
gui.box(numSpriteX0, numSpriteY0, numSpriteX1, numSpriteY1, strHighlightColor, strOutlineColor)
numDetailsBase = numBase
else
gui.box(numSpriteX0, numSpriteY0, numSpriteX1, numSpriteY1, strFillColor, strOutlineColor)
end
end
end
if numDetailsBase ~= nil then
numTextY = (1 - math.floor(tabInput.ymouse / 120)) * 127 + 16
gui.text(16, numTextY, string.format("OAM Slot: %d", numDetailsBase / 4)); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("OAM Offset: $%02X", numDetailsBase)); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Sprite X: $%02X", tabSpriteAttributes[numDetailsBase + 4])); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Sprite Y: $%02X", tabSpriteAttributes[numDetailsBase + 1])); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Tile ID: $%02X", tabSpriteAttributes[numDetailsBase + 2])); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Palette: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x03))); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Behind Background: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x20) / 0x20)); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Flip X: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x40) / 0x40)); numTextY = numTextY + 9
gui.text(16, numTextY, string.format("Flip Y: %d", AND(tabSpriteAttributes[numDetailsBase + 3], 0x80) / 0x80)); numTextY = numTextY + 9
end
gui.box(tabInput.xmouse - 2, tabInput.ymouse - 2, tabInput.xmouse + 2, tabInput.ymouse + 2, strHighlightColor, strOutlineColor)
end
memory.registerwrite(0x4014, 0x0001, readSpriteAttributes)
memory.registerwrite(0x2000, 0x2000, setSpriteHeight)
gui.register(drawBoxes)
while (true) do
emu.frameadvance()
end