From 20ab4d27b18bccc4d99e0cf54016144e63af2630 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 4 Jun 2023 22:22:31 -0700 Subject: [PATCH] Scripting: Expose rumble callback --- include/mgba-util/common.h | 4 ++++ src/core/scripting.c | 23 +++++++++++++++++++++++ src/script/stdlib.c | 1 + 3 files changed, 28 insertions(+) diff --git a/include/mgba-util/common.h b/include/mgba-util/common.h index ae86c8b3c..0fc10be58 100644 --- a/include/mgba-util/common.h +++ b/include/mgba-util/common.h @@ -44,6 +44,10 @@ CXX_GUARD_START #define restrict __restrict #endif +#ifndef containerof +#define containerof(PTR, TYPE, MEMBER) ((TYPE*) ((uintptr_t) (PTR) - offsetof(TYPE, MEMBER))) +#endif + #ifdef _MSC_VER #include #include diff --git a/src/core/scripting.c b/src/core/scripting.c index a49ef4fe0..0b3150039 100644 --- a/src/core/scripting.c +++ b/src/core/scripting.c @@ -7,6 +7,9 @@ #include #include +#ifdef M_CORE_GBA +#include +#endif #include #include #include @@ -189,6 +192,8 @@ struct mScriptCoreAdapter { #ifdef USE_DEBUGGERS struct mScriptDebugger debugger; #endif + struct mRumble rumble; + struct mRumble* oldRumble; }; struct mScriptConsole { @@ -1003,6 +1008,20 @@ mSCRIPT_DEFINE_STRUCT(mScriptCoreAdapter) mSCRIPT_DEFINE_STRUCT_CAST_TO_MEMBER(mScriptCoreAdapter, CS(mCore), _core) mSCRIPT_DEFINE_END; +static void _setRumble(struct mRumble* rumble, int enable) { + struct mScriptCoreAdapter* adapter = containerof(rumble, struct mScriptCoreAdapter, rumble); + + if (adapter->oldRumble) { + adapter->oldRumble->setRumble(adapter->oldRumble, enable); + } + + struct mScriptList args; + mScriptListInit(&args, 1); + *mScriptListAppend(&args) = mSCRIPT_MAKE_BOOL(!!enable); + mScriptContextTriggerCallback(adapter->context, "rumble", &args); + mScriptListDeinit(&args); +} + void mScriptContextAttachCore(struct mScriptContext* context, struct mCore* core) { struct mScriptValue* coreValue = mScriptValueAlloc(mSCRIPT_TYPE_MS_S(mScriptCoreAdapter)); struct mScriptCoreAdapter* adapter = calloc(1, sizeof(*adapter)); @@ -1014,6 +1033,10 @@ void mScriptContextAttachCore(struct mScriptContext* context, struct mCore* core adapter->memory.type = mSCRIPT_TYPE_MS_TABLE; adapter->memory.type->alloc(&adapter->memory); + adapter->rumble.setRumble = _setRumble; + adapter->oldRumble = core->getPeripheral(core, mPERIPH_RUMBLE); + core->setPeripheral(core, mPERIPH_RUMBLE, &adapter->rumble); + _rebuildMemoryMap(context, adapter); coreValue->value.opaque = adapter; diff --git a/src/script/stdlib.c b/src/script/stdlib.c index c6070dcb6..ae4cbf54f 100644 --- a/src/script/stdlib.c +++ b/src/script/stdlib.c @@ -86,6 +86,7 @@ mSCRIPT_DEFINE_STRUCT(mScriptCallbackManager) "- **frame**: The emulation finished a frame\n" "- **keysRead**: The emulation is about to read the key input\n" "- **reset**: The emulation has been reset\n" + "- **rumble**: The state of the rumble motor was changed. This callback is passed a single argument that specifies if it was turned on (true) or off (false)\n" "- **savedataUpdated**: The emulation has just finished modifying save data\n" "- **sleep**: The emulation has used the sleep feature to enter a low-power mode\n" "- **shutdown**: The emulation has been powered off\n"