From 7283efcb03129df6c5d3db99ae7dd9c519e1f9c4 Mon Sep 17 00:00:00 2001 From: NPO <77460082+NPO-197@users.noreply.github.com> Date: Wed, 16 Oct 2024 19:36:22 -0400 Subject: [PATCH] Fixed some broken functions, added Lua test script to tools Note I only plan to add files to the tools folder that are helpful for quickly testing the implemented Lua functions. (they aren't used in the build.) --- src/frontend/qt_sdl/EmuInstance.h | 1 + src/frontend/qt_sdl/EmuInstanceInput.cpp | 14 +++ src/frontend/qt_sdl/LuaMain.cpp | 42 +++++-- tools/LuaScripts/Lua-Logo_128x128.png | Bin 0 -> 9338 bytes tools/LuaScripts/LuaScriptTest.lua | 153 +++++++++++++++++++++++ 5 files changed, 203 insertions(+), 7 deletions(-) create mode 100644 tools/LuaScripts/Lua-Logo_128x128.png create mode 100644 tools/LuaScripts/LuaScriptTest.lua diff --git a/src/frontend/qt_sdl/EmuInstance.h b/src/frontend/qt_sdl/EmuInstance.h index 0a18e03d6e..426457e852 100644 --- a/src/frontend/qt_sdl/EmuInstance.h +++ b/src/frontend/qt_sdl/EmuInstance.h @@ -258,6 +258,7 @@ class EmuInstance bool doAudioSync; melonDS::u32 getInputMask(){return inputMask;} + std::map KeyboardMask; //For Lua Scripts private: std::unique_ptr backupState; diff --git a/src/frontend/qt_sdl/EmuInstanceInput.cpp b/src/frontend/qt_sdl/EmuInstanceInput.cpp index 87b52e1fe1..f535749994 100644 --- a/src/frontend/qt_sdl/EmuInstanceInput.cpp +++ b/src/frontend/qt_sdl/EmuInstanceInput.cpp @@ -71,6 +71,10 @@ void EmuInstance::inputInit() hotkeyMask = 0; lastHotkeyMask = 0; + for (int i=0;i<256;i++){ + KeyboardMask[i]=false; + } + joystick = nullptr; controller = nullptr; hasRumble = false; @@ -218,6 +222,11 @@ int getEventKeyVal(QKeyEvent* event) void EmuInstance::onKeyPress(QKeyEvent* event) { + if (event->key()<256) + KeyboardMask[event->key()]=true; + if ((event->key()&0x01000000)>0 && (event->key()&0xff)<0x41) //special keys (there is probably a less messy way to write this...) + KeyboardMask[0xff - (event->key()&0xff)]=true; + int keyHK = getEventKeyVal(event); int keyKP = keyHK; keyStrokes.push_back(keyHK); @@ -235,6 +244,11 @@ void EmuInstance::onKeyPress(QKeyEvent* event) void EmuInstance::onKeyRelease(QKeyEvent* event) { + if (event->key()<256) + KeyboardMask[event->key()]=false; + if ((event->key()&0x01000000)>0 && (event->key()&0xff)<0x41)//special keys + KeyboardMask[0xff - (event->key()&0xff)]=false; + int keyHK = getEventKeyVal(event); int keyKP = keyHK; if (event->modifiers() != Qt::KeypadModifier) diff --git a/src/frontend/qt_sdl/LuaMain.cpp b/src/frontend/qt_sdl/LuaMain.cpp index 600a9c4f70..4b9a0e1ebd 100644 --- a/src/frontend/qt_sdl/LuaMain.cpp +++ b/src/frontend/qt_sdl/LuaMain.cpp @@ -361,18 +361,20 @@ AddLuaFunction(Lua_Reads32,Reads32); int Lua_NDSTapDown(lua_State* L) { + LuaBundle* bundle = get_bundle(L); + melonDS::NDS* nds = bundle->getEmuInstance()->getNDS(); int x = luaL_checkinteger(L,1); int y = luaL_checkinteger(L,2); - //TODO - //NDS::TouchScreen(x,y); + nds->TouchScreen(x,y); return 0; } AddLuaFunction(Lua_NDSTapDown,NDSTapDown); int Lua_NDSTapUp(lua_State* L) { - //TODO - //NDS::ReleaseScreen(); + LuaBundle* bundle = get_bundle(L); + melonDS::NDS* nds = bundle->getEmuInstance()->getNDS(); + nds->ReleaseScreen(); return 0; } AddLuaFunction(Lua_NDSTapUp,NDSTapUp); @@ -424,6 +426,19 @@ int Lua_getMouse(lua_State* L) } AddLuaFunction(Lua_getMouse,GetMouse); +int Lua_KeyboardMask(lua_State* L) +{ + LuaBundle* bundle = get_bundle(L); + + lua_createtable(L,0,256); + for (int i=0;i<256;i++){ + lua_pushboolean(L,bundle->getEmuInstance()->KeyboardMask[i]); + lua_seti(L,-2,i); + } + return 1; +} +AddLuaFunction(Lua_KeyboardMask,KeyboardMask); + /*-------------------------------------------------------------------------------------------------- Front-end lua function definitions --------------------------------------------------------------------------------------------------*/ @@ -472,7 +487,7 @@ int Lua_Flip(lua_State* L) } AddLuaFunction(Lua_Flip,Flip); -//text(int x, int y, string message, [u32 color = 'black'], [int fontsize = 9], [string fontfamily = Franklin Gothic Medium]) +//Text(int x, int y, string message, [u32 color = 'black'], [int fontsize = 9], [string fontfamily = Franklin Gothic Medium]) int Lua_text(lua_State* L) { LuaBundle* bundle = get_bundle(L); @@ -538,6 +553,21 @@ int Lua_fillrect(lua_State* L) } AddLuaFunction(Lua_fillrect,FillRect); +int Lua_Ellipse(lua_State* L) +{ + LuaBundle* bundle = get_bundle(L); + melonDS::u32 color = luaL_checknumber(L,5); + int x = luaL_checknumber(L,1); + int y = luaL_checknumber(L,2); + int width = luaL_checknumber(L,3); + int height = luaL_checknumber(L,4); + QPainter painter(bundle->luaCanvas->imageBuffer); + painter.setPen(color); + painter.drawEllipse(x,y,width,height); + return 0; +} +AddLuaFunction(Lua_Ellipse,Ellipse); + int Lua_keystrokes(lua_State* L) { LuaBundle* bundle = get_bundle(L); @@ -548,7 +578,6 @@ int Lua_keystrokes(lua_State* L) lua_seti(L,-2,i); } bundle->getEmuInstance()->keyStrokes.clear(); - lua_createtable(L,0,1); return 1; } AddLuaFunction(Lua_keystrokes,Keys); @@ -590,7 +619,6 @@ AddLuaFunction(Lua_clearImageHash,ClearHash); int Lua_getJoy(lua_State* L) { - //TODO: LuaBundle* bundle = get_bundle(L); melonDS::u32 buttonMask=bundle->getEmuInstance()->getInputMask();//current button state. const char* keys[12] = diff --git a/tools/LuaScripts/Lua-Logo_128x128.png b/tools/LuaScripts/Lua-Logo_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdf7a9109a548c3b1fd786d68fc0452008120fc GIT binary patch literal 9338 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

rqLjHN`nT;2(sUjQNm3zgHU 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 literal 0 HcmV?d00001 diff --git a/tools/LuaScripts/LuaScriptTest.lua b/tools/LuaScripts/LuaScriptTest.lua new file mode 100644 index 0000000000..d2eea703cc --- /dev/null +++ b/tools/LuaScripts/LuaScriptTest.lua @@ -0,0 +1,153 @@ +-- Simple Script to test most of the different Lua Functions for MelonDS +-- Written by NPO197 + +MelonClear() + +MelonPrint("This text Should be cleared") + +MelonClear() + +MelonPrint("Running Test...") + +u32Data = Readu32(0x00000000) + +MelonPrint(string.format("DataZero: %x",u32Data)) + +NDSTapDown(0,0) + +NDSTapUp() + +--StateSave("SaveState_Auto") + +--StateLoad("SaveState_Auto") + +canvas = MakeCanvas(0,0,500,500) + +SetCanvas(canvas) + +ClearOverlay() + +FillRect(0,0,55,11,0xffffffff) + +Text(0,9,"Test Message") + +Line(0,10,55,10,0x00ff00ff) + +Rect(0,0,55,11,0xff00ff00) + +DrawImage("Lua-Logo_128x128.png",0,60) + +Text(0,200,"WASD to move \"lua Stylus\", Q to tap screen",0xffffff) + +--ClearHash() + +Flip() + + +-------- Main Loop ---------- + +typed = "" +keys = {} +joys = {} + +--protected ints -> string +function pInts2Str(ints) + str = "" + for _,i in pairs(ints) do + if pcall(string.char,i) then + str = str..string.char(i) + else + MelonPrint("NonAscii:"..i) + typed = "" + end + end + return str +end + + +textFunctions = { + --MousePosText + [1] = function() + mouse = GetMouse() + return "MousePos:"..mouse.X..","..mouse.Y + end, + --MouseButtonText + [2] = function() + mouse = GetMouse() + str = "" + for k,v in pairs(mouse) do + if k~="X" and k~="Y" and v then + str = str..k + end + end + return "MouseBtn:"..str + end, + --KeysText + [3] = function() + keys = Keys() + temp = pInts2Str(keys) + typed = typed..temp + return "Keys:"..typed + end, + --JoyText + [4] = function() + joys = GetJoy() + str = "" + for k,v in pairs(joys) do + if v then + str = str..k + end + end + return "Joy:"..str + end +} + +function TextLoop() + SetCanvas(textCanvas) + ClearOverlay() + y = 0 + for _,tfunct in ipairs(textFunctions) do + y = y+10 + Text(0,y,tfunct(),0xffffff) + end + Flip() +end + +Stylus = { + x = 0, + y = 0, +} + +function Stylus:Loop() + move = { + --Key = {dx,dy} + ["W"] = {0,-1}, + ["A"] = {-1,0}, + ["S"] = {0,1}, + ["D"] = {1,0} + } + mask = KeyboardMask() + for tkey,dir in pairs(move) do + if mask[string.byte(tkey)] then + self.x=self.x+dir[1] + self.y=self.y+dir[2] + end + end + if mask[string.byte("Q")] then + NDSTapDown(self.x,self.y) + else + NDSTapUp() + end + SetCanvas(vstylusCanvas) + ClearOverlay() + Ellipse(self.x-5,self.y-5,10,10,0xffffffff) + Ellipse(self.x-2,self.y-2,4,4,0x00000000) + Flip() +end + +textCanvas = MakeCanvas(0,12,500,100) +vstylusCanvas = MakeCanvas(0,0,256,192,1) -- bottom screen +function _Update() + TextLoop() + Stylus:Loop() +end