From ccc7cd4d7f19e8f5a027aee6b4f2d3c2af5a26e2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 24 May 2022 21:42:10 -0700 Subject: [PATCH] Scripting: Expose more save state functionality --- src/core/scripting.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/core/scripting.c b/src/core/scripting.c index e0109fb22..0372b27fa 100644 --- a/src/core/scripting.c +++ b/src/core/scripting.c @@ -361,6 +361,25 @@ static void _mScriptCoreWriteRegister(struct mCore* core, const char* regName, i core->writeRegister(core, regName, &in); } +static struct mScriptValue* _mScriptCoreSaveState(struct mCore* core, int32_t flags) { + struct VFile* vf = VFileMemChunk(NULL, 0); + if (!mCoreSaveStateNamed(core, vf, flags)) { + vf->close(vf); + return NULL; + } + void* buffer = vf->map(vf, vf->size(vf), MAP_READ); + struct mScriptValue* value = mScriptStringCreateFromBytes(buffer, vf->size(vf)); + vf->close(vf); + return value; +} + +static int32_t _mScriptCoreLoadState(struct mCore* core, struct mScriptValue* buffer, int32_t flags) { + struct VFile* vf = VFileFromConstMemory(buffer->value.string->buffer, buffer->value.string->size); + int ret = mCoreLoadStateNamed(core, vf, flags); + vf->close(vf); + return ret; +} + // Info functions mSCRIPT_DECLARE_STRUCT_CD_METHOD(mCore, S32, platform, 0); mSCRIPT_DECLARE_STRUCT_CD_METHOD(mCore, U32, frameCounter, 0); @@ -398,7 +417,9 @@ mSCRIPT_DECLARE_STRUCT_VOID_METHOD(mCore, writeRegister, _mScriptCoreWriteRegist // Savestate functions mSCRIPT_DECLARE_STRUCT_METHOD_WITH_DEFAULTS(mCore, S32, saveStateSlot, mCoreSaveState, 2, S32, slot, S32, flags); +mSCRIPT_DECLARE_STRUCT_METHOD_WITH_DEFAULTS(mCore, WRAPPER, saveStateBuffer, _mScriptCoreSaveState, 1, S32, flags); mSCRIPT_DECLARE_STRUCT_METHOD_WITH_DEFAULTS(mCore, S32, loadStateSlot, mCoreLoadState, 2, S32, slot, S32, flags); +mSCRIPT_DECLARE_STRUCT_METHOD_WITH_DEFAULTS(mCore, S32, loadStateBuffer, _mScriptCoreLoadState, 2, WRAPPER, buffer, S32, flags); // Miscellaneous functions mSCRIPT_DECLARE_STRUCT_VOID_METHOD(mCore, screenshot, mCoreTakeScreenshot, 0); @@ -465,8 +486,12 @@ mSCRIPT_DEFINE_STRUCT(mCore) mSCRIPT_DEFINE_DOCSTRING("Save state to the slot number. See C.SAVESTATE for possible values for `flags`") mSCRIPT_DEFINE_STRUCT_METHOD(mCore, saveStateSlot) + mSCRIPT_DEFINE_DOCSTRING("Save state and return as a buffer. See C.SAVESTATE for possible values for `flags`") + mSCRIPT_DEFINE_STRUCT_METHOD(mCore, saveStateBuffer) mSCRIPT_DEFINE_DOCSTRING("Load state from the slot number. See C.SAVESTATE for possible values for `flags`") mSCRIPT_DEFINE_STRUCT_METHOD(mCore, loadStateSlot) + mSCRIPT_DEFINE_DOCSTRING("Load state a buffer. See C.SAVESTATE for possible values for `flags`") + mSCRIPT_DEFINE_STRUCT_METHOD(mCore, loadStateBuffer) mSCRIPT_DEFINE_DOCSTRING("Save a screenshot") mSCRIPT_DEFINE_STRUCT_METHOD(mCore, screenshot) @@ -486,6 +511,15 @@ mSCRIPT_DEFINE_STRUCT_BINDING_DEFAULTS(mCore, loadStateSlot) mSCRIPT_MAKE_S32(SAVESTATE_ALL & ~SAVESTATE_SAVEDATA) mSCRIPT_DEFINE_DEFAULTS_END; +mSCRIPT_DEFINE_STRUCT_BINDING_DEFAULTS(mCore, saveStateBuffer) + mSCRIPT_MAKE_S32(SAVESTATE_ALL) +mSCRIPT_DEFINE_DEFAULTS_END; + +mSCRIPT_DEFINE_STRUCT_BINDING_DEFAULTS(mCore, loadStateBuffer) + mSCRIPT_NO_DEFAULT, + mSCRIPT_MAKE_S32(SAVESTATE_ALL & ~SAVESTATE_SAVEDATA) +mSCRIPT_DEFINE_DEFAULTS_END; + static void _clearMemoryMap(struct mScriptContext* context, struct mScriptCoreAdapter* adapter, bool clear) { struct TableIterator iter; if (mScriptTableIteratorStart(&adapter->memory, &iter)) {