From a8016502b0a8c2cdfe5e55bbc05d219fab9e14d0 Mon Sep 17 00:00:00 2001 From: ugetab Date: Mon, 10 May 2010 07:20:55 +0000 Subject: [PATCH] Added gui.getpixel() and emu.getscreenpixel() to get LUA pixel written. Also fixed some coding misconceptions about how LUA worked for Game Genie Add/Delete functions. Documented stuff. --- changelog.txt | 1 + src/lua-engine.cpp | 106 ++++++++++++++++++++++++++++++++++++++++++--- src/video.cpp | 20 +++++++++ src/video.h | 2 + vc/Help/fceux.hnd | Bin 221815 -> 222148 bytes 5 files changed, 123 insertions(+), 6 deletions(-) diff --git a/changelog.txt b/changelog.txt index 502aa982..ea7769c2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,4 @@ +10-may-2010 - ugetab - Added gui.getpixel() which gets any gui.pixel() set pixel colors, and possibly other functions. Added emu.getscreenpixel() which gets the RGB and Palette of any pixel on the screen. 08-may-2010 - ugetab - Added savestate.object() which is savestate.create() with intuitive numbering under windows 08-may-2010 - ugetab - Added emu.addgamegenie() and emu.delgamegenie() LUA functions. 07-may-2010 - ugetab - Win32 - Added context menu to Cheat Dialog Cheat Listbox, populated list with Toggle Cheat, Poke Cheat Value, and Goto In Hex Editor diff --git a/src/lua-engine.cpp b/src/lua-engine.cpp index 406cd597..2a0cec5a 100644 --- a/src/lua-engine.cpp +++ b/src/lua-engine.cpp @@ -461,13 +461,16 @@ static int emu_addgamegenie(lua_State *L) { int Ccompare, Ctype; if (!FCEUI_DecodeGG(msg, &GGaddr, &GGval, &GGcomp)) { - return 0; + luaL_error(L, "Failed to decode game genie code"); + lua_pushboolean(L, false); + return 1; } while (FCEUI_GetCheat(i,NULL,&Caddr,&Cval,&Ccompare,NULL,&Ctype)) { if ((GGaddr == Caddr) && (GGval == Cval) && (GGcomp == Ccompare) && (Ctype == 1)) { // Already Added, so consider it a success + lua_pushboolean(L, true); return 1; } @@ -478,10 +481,12 @@ static int emu_addgamegenie(lua_State *L) { // Code was added // Can't manage the display update the way I want, so I won't bother with it // UpdateCheatsAdded(); + lua_pushboolean(L, true); return 1; } else { // Code didn't get added - return 0; + lua_pushboolean(L, false); + return 1; } } @@ -499,23 +504,30 @@ static int emu_delgamegenie(lua_State *L) { int Ccompare, Ctype; if (!FCEUI_DecodeGG(msg, &GGaddr, &GGval, &GGcomp)) { - return 0; + luaL_error(L, "Failed to decode game genie code"); + lua_pushboolean(L, false); + return 1; } while (FCEUI_GetCheat(i,&Cname,&Caddr,&Cval,&Ccompare,NULL,&Ctype)) { if ((!strcmp(msg,Cname)) && (GGaddr == Caddr) && (GGval == Cval) && (GGcomp == Ccompare) && (Ctype == 1)) { // Delete cheat code - if (FCEUI_DelCheat(i)) + if (FCEUI_DelCheat(i)) { + lua_pushboolean(L, true); return 1; - else - return 0; + } + else { + lua_pushboolean(L, false); + return 1; + } } i = i + 1; } // Cheat didn't exist, so it's not an error + lua_pushboolean(L, true); return 1; } @@ -3129,6 +3141,86 @@ static int gui_pixel(lua_State *L) { return 0; } +// Usage: +// local r,g,b,a = gui.getpixel(255, 223) +// Gets the LUA set pixel color +static int gui_getpixel(lua_State *L) { + + int x = luaL_checkinteger(L, 1); + int y = luaL_checkinteger(L,2); + + int r, g, b, a; + + if (!gui_check_boundary(x, y)) + luaL_error(L,"bad coordinates. Use 0-%d x 0-%d", LUA_SCREEN_WIDTH - 1, LUA_SCREEN_HEIGHT - 1); + + if (!gui_data) { + // Return all 0s, including for alpha. + // If alpha == 0, there was no color data for that spot + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + return 4; + } + + //uint8 *dst = (uint8*) &gui_data[(y*LUA_SCREEN_WIDTH+x)*4]; + + //uint32 color = *(uint32*) &gui_data[(y*LUA_SCREEN_WIDTH+x)*4]; + + LUA_DECOMPOSE_PIXEL(*(uint32*) &gui_data[(y*LUA_SCREEN_WIDTH+x)*4], a, r, g, b); + + lua_pushinteger(L, r); + lua_pushinteger(L, g); + lua_pushinteger(L, b); + lua_pushinteger(L, a); + return 4; + +} + +// Usage: +// local r,g,b,palette = gui.getpixel(255, 255) +// Gets the screen pixel color +// Palette will be 254 on error +static int emu_getscreenpixel(lua_State *L) { + + int x = luaL_checkinteger(L, 1); + int y = luaL_checkinteger(L,2); + + int r, g, b; + int palette; + + if (((x < 0) || (x > 255)) || ((y < 0) || (y > 239))) { + luaL_error(L,"bad coordinates. Use 0-255 x 0-239"); + + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + lua_pushinteger(L, 254); + return 4; + } + + if (!XBuf) { + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + lua_pushinteger(L, 0); + lua_pushinteger(L, 254); + return 4; + } + + uint32 pixelinfo = GetScreenPixel(x,y); + + LUA_DECOMPOSE_PIXEL(pixelinfo, palette, r, g, b); + palette = GetScreenPixelPalette(x,y); + + lua_pushinteger(L, r); + lua_pushinteger(L, g); + lua_pushinteger(L, b); + lua_pushinteger(L, palette); + return 4; + +} + // gui.line(x1,y1,x2,y2,color,skipFirst) static int gui_line(lua_State *L) { @@ -4497,6 +4589,7 @@ static const struct luaL_reg emulib [] = { {"registerexit", emu_registerexit}, {"addgamegenie", emu_addgamegenie}, {"delgamegenie", emu_delgamegenie}, + {"getscreenpixel", emu_getscreenpixel}, {"readonly", movie_getreadonly}, {"setreadonly", movie_setreadonly}, {"print", print}, // sure, why not @@ -4609,6 +4702,7 @@ static const struct luaL_reg movielib[] = { static const struct luaL_reg guilib[] = { {"pixel", gui_pixel}, + {"getpixel", gui_getpixel}, {"line", gui_line}, {"box", gui_box}, {"text", gui_text}, diff --git a/src/video.cpp b/src/video.cpp index f731ad55..a18e879d 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -414,6 +414,26 @@ static int WritePNGChunk(FILE *fp, uint32 size, char *type, uint8 *data) return 1; } +uint32 GetScreenPixel(int x, int y) { + + uint8 r,g,b; + + if (((x < 0) || (x > 255)) || ((y < 0) || (y > 255))) + return -1; + + FCEUD_GetPalette(XBuf[(y*256)+x],&r,&g,&b); + + return ((int) (r) << 16) | ((int) (g) << 8) | (int) (b); +} + +int GetScreenPixelPalette(int x, int y) { + + if (((x < 0) || (x > 255)) || ((y < 0) || (y > 255))) + return -1; + + return XBuf[(y*256)+x] & 0x3f; +} + int SaveSnapshot(void) { unsigned int lastu=0; diff --git a/src/video.h b/src/video.h index 8d5a71dd..1de5f115 100644 --- a/src/video.h +++ b/src/video.h @@ -1,6 +1,8 @@ int FCEU_InitVirtualVideo(void); void FCEU_KillVirtualVideo(void); int SaveSnapshot(void); +uint32 GetScreenPixel(int x, int y); +int GetScreenPixelPalette(int x, int y); extern uint8 *XBuf; extern uint8 *XBackBuf; extern int ClipSidesOffset; diff --git a/vc/Help/fceux.hnd b/vc/Help/fceux.hnd index 714ac5873324c4c91106c7a51f1395ae7400e24b..48e7f990dff1ec6405e3421cab60c22c85d712bd 100644 GIT binary patch delta 13715 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 tkl8`WYpkG`IS~Ih2hbF=X8;2(NiOM{_^C0^zLt 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