Mesen-X/GUI.NET/Dependencies/LuaScripts/GameBoyMode.lua

108 lines
No EOL
3.8 KiB
Lua

-----------------------
-- Name: Game Boy Mode
-- Author: upsilandre
-----------------------
-- Simulates the game boy's display limitations
-- 1. Adds a 160x144 frame which can be moved by clicking inside it. Clicking outside of it will hide the black overlay.
-- 2. Restricts the palette to a 4-color palette like the game boy - right-click the screen to change the palette.
-----------------------
function Main()
mouse = emu.getMouseState()
if mouse.left then
if stencil then
if mouse.x > window_X and mouse.x < window_X + 160 and mouse.y > window_Y and mouse.y < window_Y + 144 then
window_X = mouse.x - 80
window_Y = mouse.y - 72
else
stencil = false
holdLeft = true
end
else
if not holdLeft then
holdLeft = true
stencil = true
window_X = mouse.x - 80
window_Y = mouse.y - 72
end
end
else
holdLeft = false
end
if stencil then
if window_X > 0 then
emu.drawRectangle(0, window_Y, window_X, 144, 0x000000, true)
end
if window_X < 96 then
emu.drawRectangle(window_X + 160, window_Y, 96 - window_X, 144, 0x000000, true)
end
if window_Y > 0 then
emu.drawRectangle(0, 0, 256, window_Y, 0x000000, true)
end
if window_Y < 96 then
emu.drawRectangle(0, window_Y + 144, 256, 96 - window_Y, 0x000000, true)
end
end
if mouse.right then
if not holdRight then
holdRight = true
UI_X = mouse.x - selectX
UI_Y = mouse.y - selectY
end
emu.drawRectangle(UI_X+16, UI_Y, 128, 16, 0x808080, true)
emu.drawRectangle(UI_X, UI_Y+16, 16, 128, 0x808080, true)
for x = UI_X+16, UI_X+128, 16 do
emu.drawRectangle(x, UI_Y, 17, 17, 0x404040)
end
for y = UI_Y+16, UI_Y+128, 16 do
emu.drawRectangle(UI_X, y, 17, 17, 0x404040)
end
if mouse.x > UI_X + 16 and mouse.x < UI_X + 145 and mouse.y > UI_Y + 16 and mouse.y < UI_Y + 145 then
paletteBg = (mouse.x - 1 - UI_X) >> 4
paletteSpr = (mouse.y - 1 - UI_Y) >> 4
offsetX = (UI_X & 0x0f) + 1
offsetY = (UI_Y & 0x0f) + 1
emu.drawRectangle(((mouse.x - offsetX) & 0xf0) + offsetX, UI_Y+1, 15, 15, 0xff0000, true)
emu.drawRectangle( UI_X+1, ((mouse.y - offsetY) & 0xf0) + offsetY, 15, 15, 0xff0000, true)
emu.drawLine(UI_X+17, mouse.y, mouse.x, mouse.y, 0xff0000)
emu.drawLine(mouse.x, UI_Y+17, mouse.x, mouse.y, 0xff0000)
selectX = mouse.x - UI_X
selectY = mouse.y - UI_Y
end
for i = 1,#text,3 do
emu.drawString(UI_X + text[i], UI_Y + text[i+1], text[i+2], 0xffffff, 0xff000000)
end
else
holdRight = false
end
for palAddr = 0,0x0f,4 do
emu.write(palAddr, color[paletteBg][1], emu.memType.palette)
emu.write(palAddr + 1, color[paletteBg][2], emu.memType.palette)
emu.write(palAddr + 2, color[paletteBg][3], emu.memType.palette)
emu.write(palAddr + 3, color[paletteBg][4], emu.memType.palette)
emu.write(palAddr + 16, color[paletteBg][1], emu.memType.palette)
emu.write(palAddr + 17, color[paletteSpr][1], emu.memType.palette)
emu.write(palAddr + 18, color[paletteSpr][2], emu.memType.palette)
emu.write(palAddr + 19, color[paletteSpr][3], emu.memType.palette)
end
end
stencil = false
holdLeft = false
holdRight = false
window_X = 48
window_Y = 48
selectX = 72
selectY = 72
paletteSpr = 4
paletteBg = 4
color = {{0x38,0x28,0x18,0x08},{0x28,0x18,0x08,0x38},{0x18,0x08,0x38,0x28},{0x08,0x38,0x28,0x18},
{0x08,0x18,0x28,0x38},{0x18,0x28,0x38,0x08},{0x28,0x38,0x08,0x18},{0x38,0x08,0x18,0x28}}
text = {48,-9,"Background",22,5,"1",38,5,"2",54,5,"3",70,5,"4",86,5,"5",102,5,"6",
118,5,"7",134,5,"8",-6,51,"S",-6,57,"p",-6,64,"r",-6,72,"i",-7,80,"t",-7,86,"e",
6,21,"1",6,37,"2",6,53,"3",6,69,"4",6,85,"5",6,101,"6",6,117,"7",6,133,"8"}
emu.addEventCallback(Main, emu.eventType.startFrame)
emu.displayMessage("Script", "Game Boy mode")