Skip to content

Commit

Permalink
Fixed some broken functions, added Lua test script to tools
Browse files Browse the repository at this point in the history
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.)
  • Loading branch information
NPO-197 committed Oct 16, 2024
1 parent 487b80c commit 7283efc
Show file tree
Hide file tree
Showing 5 changed files with 203 additions and 7 deletions.
1 change: 1 addition & 0 deletions src/frontend/qt_sdl/EmuInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ class EmuInstance
bool doAudioSync;

melonDS::u32 getInputMask(){return inputMask;}
std::map<melonDS::u8,bool> KeyboardMask; //For Lua Scripts
private:

std::unique_ptr<melonDS::Savestate> backupState;
Expand Down
14 changes: 14 additions & 0 deletions src/frontend/qt_sdl/EmuInstanceInput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down
42 changes: 35 additions & 7 deletions src/frontend/qt_sdl/LuaMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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
--------------------------------------------------------------------------------------------------*/
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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] =
Expand Down
Binary file added tools/LuaScripts/Lua-Logo_128x128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
153 changes: 153 additions & 0 deletions tools/LuaScripts/LuaScriptTest.lua
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 7283efc

Please sign in to comment.