Skip to content

Commit df12fa2

Browse files
committed
Added more movie JS interface functions. Hooked up lua joypad.getimmediate functionality for Qt GUI.
1 parent aaa519d commit df12fa2

File tree

6 files changed

+173
-22
lines changed

6 files changed

+173
-22
lines changed

src/drivers/Qt/ConsoleWindow.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -1096,10 +1096,10 @@ void consoleWin_t::createMainMenu(void)
10961096
loadLuaAct = nullptr;
10971097
#endif
10981098

1099-
#ifdef _S9XLUA_H
1100-
// File -> Load QScript
1101-
loadJsAct = new QAction(tr("Load &Qt Script"), this);
1102-
loadJsAct->setStatusTip(tr("Load Qt Script"));
1099+
#ifdef __FCEU_QSCRIPT_ENABLE__
1100+
// File -> Load JavaScript
1101+
loadJsAct = new QAction(tr("Load &JavaScript"), this);
1102+
loadJsAct->setStatusTip(tr("Load JavaScript"));
11031103
connect(loadJsAct, SIGNAL(triggered()), this, SLOT(loadJs(void)) );
11041104

11051105
fileMenu->addAction(loadJsAct);

src/drivers/Qt/QtScriptManager.cpp

+128
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#endif
3030

3131
#include <QTextEdit>
32+
#include <QFileInfo>
3233
#include <QFileDialog>
3334
#include <QMessageBox>
3435
#include <QSettings>
@@ -184,6 +185,15 @@ bool JoypadScriptObject::buttonChanged(enum Button b)
184185
return hasChanged;
185186
}
186187
//----------------------------------------------------
188+
Q_INVOKABLE void JoypadScriptObject::ovrdResetAll()
189+
{
190+
for (int i=0; i<MAX_JOYPAD_PLAYERS; i++)
191+
{
192+
jsOverrideMask1[i] = 0xFF;
193+
jsOverrideMask2[i] = 0x00;
194+
}
195+
}
196+
//----------------------------------------------------
187197
//---- EMU State Object
188198
//----------------------------------------------------
189199
int EmuStateScriptObject::numInstances = 0;
@@ -924,6 +934,111 @@ bool MovieScriptObject::isFromSaveState()
924934
return flag;
925935
}
926936
//----------------------------------------------------
937+
void MovieScriptObject::replay()
938+
{
939+
FCEUI_MoviePlayFromBeginning();
940+
}
941+
//----------------------------------------------------
942+
bool MovieScriptObject::readOnly()
943+
{
944+
return FCEUI_GetMovieToggleReadOnly();
945+
}
946+
//----------------------------------------------------
947+
void MovieScriptObject::setReadOnly(bool which)
948+
{
949+
FCEUI_SetMovieToggleReadOnly(which);
950+
}
951+
//----------------------------------------------------
952+
int MovieScriptObject::mode()
953+
{
954+
int _mode = IDLE;
955+
if (FCEUMOV_Mode(MOVIEMODE_TASEDITOR))
956+
{
957+
_mode = TAS_EDITOR;
958+
}
959+
else if (FCEUMOV_IsRecording())
960+
{
961+
_mode = RECORD;
962+
}
963+
else if (FCEUMOV_IsFinished())
964+
{
965+
_mode = FINISHED; //Note: this comes before playback since playback checks for finished as well
966+
}
967+
else if (FCEUMOV_IsPlaying())
968+
{
969+
_mode = PLAYBACK;
970+
}
971+
else
972+
{
973+
_mode = IDLE;
974+
}
975+
return _mode;
976+
}
977+
//----------------------------------------------------
978+
void MovieScriptObject::stop()
979+
{
980+
FCEUI_StopMovie();
981+
}
982+
//----------------------------------------------------
983+
int MovieScriptObject::frameCount()
984+
{
985+
return FCEUMOV_GetFrame();
986+
}
987+
//----------------------------------------------------
988+
int MovieScriptObject::length()
989+
{
990+
if (!FCEUMOV_IsRecording() && !FCEUMOV_IsPlaying() && !FCEUMOV_Mode(MOVIEMODE_TASEDITOR))
991+
{
992+
script->throwError(QJSValue::GenericError, "No movie loaded.");
993+
}
994+
return FCEUI_GetMovieLength();
995+
}
996+
//----------------------------------------------------
997+
int MovieScriptObject::rerecordCount()
998+
{
999+
if (!FCEUMOV_IsRecording() && !FCEUMOV_IsPlaying() && !FCEUMOV_Mode(MOVIEMODE_TASEDITOR))
1000+
{
1001+
script->throwError(QJSValue::GenericError, "No movie loaded.");
1002+
}
1003+
return FCEUI_GetMovieRerecordCount();
1004+
}
1005+
//----------------------------------------------------
1006+
QString MovieScriptObject::getFilepath()
1007+
{
1008+
if (!FCEUMOV_IsRecording() && !FCEUMOV_IsPlaying() && !FCEUMOV_Mode(MOVIEMODE_TASEDITOR))
1009+
{
1010+
script->throwError(QJSValue::GenericError, "No movie loaded.");
1011+
}
1012+
return QString::fromStdString(FCEUI_GetMovieName());
1013+
}
1014+
//----------------------------------------------------
1015+
QString MovieScriptObject::getFilename()
1016+
{
1017+
if (!FCEUMOV_IsRecording() && !FCEUMOV_IsPlaying() && !FCEUMOV_Mode(MOVIEMODE_TASEDITOR))
1018+
{
1019+
script->throwError(QJSValue::GenericError, "No movie loaded.");
1020+
}
1021+
QFileInfo fi( QString::fromStdString(FCEUI_GetMovieName()) );
1022+
return fi.fileName();
1023+
}
1024+
//----------------------------------------------------
1025+
bool MovieScriptObject::skipRerecords = false;
1026+
//----------------------------------------------------
1027+
void MovieScriptObject::rerecordCounting(bool counting)
1028+
{
1029+
skipRerecords = counting;
1030+
}
1031+
//----------------------------------------------------
1032+
bool MovieScriptObject::play(const QString& filename, bool readOnly, int pauseFrame)
1033+
{
1034+
if (pauseFrame < 0) pauseFrame = 0;
1035+
1036+
// Load it!
1037+
bool loaded = FCEUI_LoadMovie(filename.toLocal8Bit().data(), readOnly, pauseFrame);
1038+
1039+
return loaded;
1040+
}
1041+
//----------------------------------------------------
9271042
bool MovieScriptObject::record(const QString& filename, int saveType, const QString author)
9281043
{
9291044
if (filename.isEmpty())
@@ -1751,6 +1866,7 @@ bool QtScriptInstance::onGuiThread()
17511866
int QtScriptInstance::throwError(QJSValue::ErrorType errorType, const QString &message)
17521867
{
17531868
running = false;
1869+
mem->reset();
17541870
engine->throwError(errorType, message);
17551871
return 0;
17561872
}
@@ -2075,6 +2191,13 @@ void QtScriptManager::removeScriptInstance(QtScriptInstance* script)
20752191
it++;
20762192
}
20772193
}
2194+
2195+
// If no scripts are loaded, reset globals
2196+
if (scriptList.size() == 0)
2197+
{
2198+
JS::MovieScriptObject::skipRerecords = false;
2199+
JS::JoypadScriptObject::ovrdResetAll();
2200+
}
20782201
}
20792202
//----------------------------------------------------
20802203
void QtScriptManager::frameBeginUpdate()
@@ -2713,6 +2836,11 @@ void QScriptDialog_t::logOutput(const QString& text)
27132836
}
27142837
}
27152838
//----------------------------------------------------
2839+
bool FCEU_JSRerecordCountSkip()
2840+
{
2841+
return JS::MovieScriptObject::skipRerecords;
2842+
}
2843+
//----------------------------------------------------
27162844
uint8_t FCEU_JSReadJoypad(int which, uint8_t joyl)
27172845
{
27182846
return JS::JoypadScriptObject::readOverride(which, joyl);

src/drivers/Qt/QtScriptManager.h

+29-8
Original file line numberDiff line numberDiff line change
@@ -270,14 +270,7 @@ public slots:
270270
jsOverrideMask2[player] = 0x00;
271271
}
272272

273-
Q_INVOKABLE void ovrdResetAll()
274-
{
275-
for (int i=0; i<MAX_JOYPAD_PLAYERS; i++)
276-
{
277-
jsOverrideMask1[i] = 0xFF;
278-
jsOverrideMask2[i] = 0x00;
279-
}
280-
}
273+
Q_INVOKABLE static void ovrdResetAll();
281274
};
282275

283276
class EmuStateScriptObject: public QObject
@@ -408,6 +401,7 @@ class MemoryScriptObject: public QObject
408401
QJSValue* getReadFunc(int address) { return readFunc[address]; }
409402
QJSValue* getWriteFunc(int address) { return writeFunc[address]; }
410403
QJSValue* getExecFunc(int address) { return execFunc[address]; }
404+
411405
private:
412406
static constexpr int AddressRange = 0x10000;
413407
FCEU::JSEngine* engine = nullptr;
@@ -483,13 +477,25 @@ class MovieScriptObject: public QObject
483477

484478
void setEngine(FCEU::JSEngine* _engine){ engine = _engine; }
485479

480+
enum Mode
481+
{
482+
IDLE = 0,
483+
RECORD,
484+
PLAYBACK,
485+
FINISHED,
486+
TAS_EDITOR
487+
};
488+
Q_ENUM(Mode);
489+
486490
enum SaveType
487491
{
488492
FROM_POWERON = 0,
489493
FROM_SAVESTATE,
490494
FROM_SAVERAM,
491495
};
492496
Q_ENUM(SaveType);
497+
498+
static bool skipRerecords;
493499
private:
494500
FCEU::JSEngine* engine = nullptr;
495501
QtScriptInstance* script = nullptr;
@@ -500,7 +506,20 @@ public slots:
500506
Q_INVOKABLE bool isRecording();
501507
Q_INVOKABLE bool isPowerOn();
502508
Q_INVOKABLE bool isFromSaveState();
509+
Q_INVOKABLE void replay();
510+
Q_INVOKABLE bool readOnly();
511+
Q_INVOKABLE void setReadOnly(bool which);
512+
Q_INVOKABLE bool play(const QString& filename, bool readOnly = false, int pauseFrame = 0);
503513
Q_INVOKABLE bool record(const QString& filename, int saveType = FROM_POWERON, const QString author = QString());
514+
Q_INVOKABLE int frameCount();
515+
Q_INVOKABLE int mode();
516+
Q_INVOKABLE void stop();
517+
Q_INVOKABLE int length();
518+
Q_INVOKABLE int rerecordCount();
519+
Q_INVOKABLE void rerecordCounting(bool counting);
520+
Q_INVOKABLE QString getFilename();
521+
Q_INVOKABLE QString getFilepath();
522+
504523
};
505524

506525
class InputScriptObject: public QObject
@@ -733,6 +752,8 @@ private slots:
733752
void stopScript(void);
734753
};
735754

755+
bool FCEU_JSRerecordCountSkip();
756+
736757
uint8_t FCEU_JSReadJoypad(int which, uint8_t phyState);
737758

738759
#endif // __FCEU_QSCRIPT_ENABLE__

src/fceulua.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void FCEU_LuaReadZapper(const uint32* mouse_in, uint32* mouse_out);
7373
uint8 FCEU_LuaReadJoypad(int,uint8); // HACK - Function needs controller input
7474
int FCEU_LuaSpeed();
7575
int FCEU_LuaFrameskip();
76-
int FCEU_LuaRerecordCountSkip();
76+
bool FCEU_LuaRerecordCountSkip();
7777

7878
void FCEU_LuaGui(uint8 *XBuf);
7979
void FCEU_LuaUpdatePalette();

src/lua-engine.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2899,7 +2899,7 @@ static int joypad_getimmediate(lua_State *L)
28992899
luaL_error(L,"Invalid input port (valid range 1-4, specified %d)", which);
29002900
}
29012901
// Currently only supports Windows, sorry...
2902-
#ifdef __WIN_DRIVER__
2902+
#if defined(__WIN_DRIVER__) || defined(__QT_DRIVER__)
29032903
extern uint32 GetGamepadPressedImmediate();
29042904
uint8 buttons = GetGamepadPressedImmediate() >> ((which - 1) * 8);
29052905

@@ -6738,7 +6738,7 @@ uint8 FCEU_LuaReadJoypad(int which, uint8 joyl) {
67386738
*
67396739
* This function will not return true if a script is not running.
67406740
*/
6741-
int FCEU_LuaRerecordCountSkip() {
6741+
bool FCEU_LuaRerecordCountSkip() {
67426742
// FIXME: return true if (there are any active callback functions && skipRerecords)
67436743
return L && luaRunning && skipRerecords;
67446744
}

src/movie.cpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -1645,18 +1645,20 @@ bool FCEUMOV_PostLoad(void)
16451645

16461646
void FCEUMOV_IncrementRerecordCount()
16471647
{
1648+
bool skip = false;
16481649
#ifdef _S9XLUA_H
1649-
if(!FCEU_LuaRerecordCountSkip())
1650+
skip = skip || FCEU_LuaRerecordCountSkip();
1651+
#endif
1652+
#ifdef __FCEU_QSCRIPT_ENABLE__
1653+
extern bool FCEU_JSRerecordCountSkip();
1654+
skip = skip || FCEU_JSRerecordCountSkip();
1655+
#endif
1656+
1657+
if(!skip)
16501658
if (movieMode != MOVIEMODE_TASEDITOR)
16511659
currRerecordCount++;
16521660
else
16531661
currMovieData.rerecordCount++;
1654-
#else
1655-
if (movieMode != MOVIEMODE_TASEDITOR)
1656-
currRerecordCount++;
1657-
else
1658-
currMovieData.rerecordCount++;
1659-
#endif
16601662
if (movieMode != MOVIEMODE_TASEDITOR)
16611663
currMovieData.rerecordCount = currRerecordCount;
16621664
}

0 commit comments

Comments
 (0)