enabling some more Lua functionality (like input.get().x/y, movie.replay(), emu.emulating())

This commit is contained in:
nitsuja 2009-08-22 09:12:27 +00:00
parent 54193cc623
commit 17d4b20115
4 changed files with 103 additions and 71 deletions

View File

@ -138,7 +138,7 @@ static const char* luaCallIDStrings [] =
};
static const int _makeSureWeHaveTheRightNumberOfStrings [sizeof(luaCallIDStrings)/sizeof(*luaCallIDStrings) == LUACALL_COUNT ? 1 : 0];
static const char* luaMemHookTypeStrings [] =
/*static const char* luaMemHookTypeStrings [] =
{
"MEMHOOK_WRITE",
"MEMHOOK_READ",
@ -149,6 +149,7 @@ static const char* luaMemHookTypeStrings [] =
"MEMHOOK_EXEC_SUB",
};
static const int _makeSureWeHaveTheRightNumberOfStrings2 [sizeof(luaMemHookTypeStrings)/sizeof(*luaMemHookTypeStrings) == LUAMEMHOOK_COUNT ? 1 : 0];
*/
void StopScriptIfFinished(int uid, bool justReturned = false);
void SetSaveKey(LuaContextInfo& info, const char* key);
@ -159,6 +160,9 @@ void RefreshScriptSpeedStatus();
static char* rawToCString(lua_State* L, int idx=0);
static const char* toCString(lua_State* L, int idx=0);
/*
// disabled, see comment above implementation of CalculateMemHookRegions
static void CalculateMemHookRegions(LuaMemHookType hookType);
static int memory_registerHook(lua_State* L, LuaMemHookType hookType, int defaultSize)
@ -266,7 +270,7 @@ DEFINE_LUA_FUNCTION(memory_registerexec, "address,[size=2,][cpuname=\"main\",]fu
{
return memory_registerHook(L, MatchHookTypeToCPU(L,LUAMEMHOOK_EXEC), 2);
}
*/
DEFINE_LUA_FUNCTION(emu_registerbefore, "func")
{
@ -2721,6 +2725,8 @@ DEFINE_LUA_FUNCTION(emu_openscript, "filename")
#endif
return 0;
}
// TODO
/*
DEFINE_LUA_FUNCTION(gens_loadrom, "filename")
{
@ -2749,17 +2755,18 @@ DEFINE_LUA_FUNCTION(emu_lagged, "")
{
lua_pushboolean(L, LagFrameFlag);
return 1;
}/*
DEFINE_LUA_FUNCTION(gens_emulating, "")
}
DEFINE_LUA_FUNCTION(emu_emulating, "")
{
lua_pushboolean(L, Genesis_Started||SegaCD_Started||_32X_Started);
lua_pushboolean(L, romloaded);
return 1;
}
DEFINE_LUA_FUNCTION(gens_atframeboundary, "")
DEFINE_LUA_FUNCTION(emu_atframeboundary, "")
{
lua_pushboolean(L, !Inside_Frame);
// TODO (actually this is a full implementation currently since registermemory callbacks are disabled)
lua_pushboolean(L, true);
return 1;
}*/
}
DEFINE_LUA_FUNCTION(movie_getlength, "")
{
lua_pushinteger(L, currMovieData.records.size());
@ -2774,12 +2781,12 @@ DEFINE_LUA_FUNCTION(movie_rerecordcount, "")
{
lua_pushinteger(L, currMovieData.rerecordCount);
return 1;
}/*
}
DEFINE_LUA_FUNCTION(movie_setrerecordcount, "")
{
MainMovie.NbRerecords = luaL_checkinteger(L, 1);
currMovieData.rerecordCount = luaL_checkinteger(L, 1);
return 0;
}*/
}
DEFINE_LUA_FUNCTION(emu_rerecordcounting, "[enabled]")
{
LuaContextInfo& info = GetCurrentInfo();
@ -2854,30 +2861,29 @@ DEFINE_LUA_FUNCTION(movie_getname, "")
DEFINE_LUA_FUNCTION(movie_play, "[filename]")
{
const char* filename = lua_isstring(L,1) ? lua_tostring(L,1) : NULL;
FCEUI_LoadMovie(filename, true, false, 0);
// const char* errorMsg =
// if(errorMsg)
// luaL_error(L, errorMsg);
const char* errorMsg = FCEUI_LoadMovie(filename, true, false, 0);
if(errorMsg)
luaL_error(L, errorMsg);
return 0;
} /*
}
DEFINE_LUA_FUNCTION(movie_replay, "")
{
if(MainMovie.File)
GensReplayMovie();
else
luaL_error(L, "it is invalid to call movie.replay when no movie open.");
return 0;
} */
if(movieMode == MOVIEMODE_INACTIVE)
return 0;
lua_settop(L, 0);
extern char curMovieFilename[512];
lua_pushstring(L, curMovieFilename);
return movie_play(L);
}
DEFINE_LUA_FUNCTION(movie_close, "")
{
FCEUI_StopMovie();
return 0;
}
DEFINE_LUA_FUNCTION(sound_clear, "")
{
// Clear_Sound_Buffer();
if(SPU_user) SPU_user->ShutUp();
return 0;
}
@ -3043,20 +3049,18 @@ DEFINE_LUA_FUNCTION(input_getcurrentinputstatus, "")
}
// mouse position in game screen pixel coordinates
{
/* POINT point;
RECT rect, srcRectUnused;
float xRatioUnused, yRatioUnused;
int depUnused;
void UnscaleScreenCoords(s32& x, s32& y);
void ToDSScreenRelativeCoords(s32& x, s32& y, bool bottomScreen);
POINT point;
GetCursorPos(&point);
ScreenToClient(MainWindow->getHWnd(), &point);
GetClientRect(MainWindow->getHWnd(), &rect);
void CalculateDrawArea(int Render_Mode, RECT& RectDest, RECT& RectSrc, float& Ratio_X, float& Ratio_Y, int& Dep);
CalculateDrawArea(Full_Screen ? Render_FS : Render_W, rect, srcRectUnused, xRatioUnused, yRatioUnused, depUnused);
int xres = ((VDP_Reg.Set4 & 0x1) || Debug || !Game || !FrameCount) ? 320 : 256;
int yres = ((VDP_Reg.Set2 & 0x8) && !(Debug || !Game || !FrameCount)) ? 240 : 224;
int x = ((point.x - rect.left) * xres) / max(1, rect.right - rect.left);
int y = ((point.y - rect.top) * yres) / max(1, rect.bottom - rect.top);*/
int x = 0, y = 0;
s32 x (point.x);
s32 y (point.y);
UnscaleScreenCoords(x,y);
ToDSScreenRelativeCoords(x,y,false);
lua_pushinteger(L, x);
lua_setfield(L, -2, "xmouse");
lua_pushinteger(L, y);
@ -3323,6 +3327,8 @@ static const struct luaL_reg aggcustom [] =
//
// Displays the given text on the screen, using the same font and techniques as the
// main HUD.
//
// TODO: this incomplete... it should support color and outline color and a much smaller font size
static int gui_text(lua_State *L) {
const char *msg;
int x, y;
@ -3372,6 +3378,7 @@ static const struct luaL_reg styluslib [] =
static const struct luaL_reg emulib [] =
{
// TODO!
// {"frameadvance", emu_frameadvance},
// {"speedmode", emu_speedmode},
// {"wait", emu_wait},
@ -3385,8 +3392,8 @@ static const struct luaL_reg emulib [] =
{"framecount", emu_getframecount},
{"lagcount", emu_getlagcount},
{"lagged", emu_lagged},
// {"emulating", emu_emulating},
// {"atframeboundary", emu_atframeboundary},
{"emulating", emu_emulating},
{"atframeboundary", emu_atframeboundary},
{"registerbefore", emu_registerbefore},
{"registerafter", emu_registerafter},
// {"registerstart", emu_registerstart},
@ -3514,7 +3521,7 @@ static const struct luaL_reg movielib [] =
{"length", movie_getlength},
{"name", movie_getname},
{"rerecordcount", movie_rerecordcount},
// {"setrerecordcount", movie_setrerecordcount},
{"setrerecordcount", movie_setrerecordcount},
{"rerecordcounting", emu_rerecordcounting},
{"readonly", movie_getreadonly},
@ -3522,7 +3529,7 @@ static const struct luaL_reg movielib [] =
{"framecount", emu_getframecount}, // for those familiar with other emulators that have movie.framecount() instead of emulatorname.framecount()
{"play", movie_play},
// {"replay", movie_replay},
{"replay", movie_replay},
{"stop", movie_close},
// alternative names
@ -3535,7 +3542,7 @@ static const struct luaL_reg movielib [] =
};
static const struct luaL_reg soundlib [] =
{
// {"clear", sound_clear},
{"clear", sound_clear},
{NULL, NULL}
};
@ -3765,13 +3772,14 @@ void registerLibs(lua_State* L)
}
lua_pop(L,1);
}
/*
// push arrays for storing hook functions in
for(int i = 0; i < LUAMEMHOOK_COUNT; i++)
{
lua_newtable(L);
lua_setfield(L, LUA_REGISTRYINDEX, luaMemHookTypeStrings[i]);
}
*/
}
void ResetInfo(LuaContextInfo& info)
@ -4152,8 +4160,10 @@ void StopLuaScript(int uid)
info.started = false;
info.numMemHooks = 0;
/*
for(int i = 0; i < LUAMEMHOOK_COUNT; i++)
CalculateMemHookRegions((LuaMemHookType)i);
*/
}
RefreshScriptStartedStatus();
}
@ -4166,7 +4176,7 @@ void CloseLuaContext(int uid)
luaContextInfo.erase(uid);
}
/*
// the purpose of this structure is to provide a way of
// QUICKLY determining whether a memory address range has a hook associated with it,
// with a bias toward fast rejection because the majority of addresses will not be hooked.
@ -4253,6 +4263,10 @@ struct TieredRegion
TieredRegion hookedRegions [LUAMEMHOOK_COUNT];
// currently disabled for desmume,
// and the performance hit might not be accepable
// unless we can switch the emulation into a whole separate path
// that has this callback enabled.
static void CalculateMemHookRegions(LuaMemHookType hookType)
{
std::vector<unsigned int> hookedBytes;
@ -4339,6 +4353,7 @@ static void CallRegisteredLuaMemHook_LuaMatch(unsigned int address, int size, un
++iter;
}
}
void CallRegisteredLuaMemHook(unsigned int address, int size, unsigned int value, LuaMemHookType hookType)
{
// performance critical! (called VERY frequently)
@ -4354,7 +4369,7 @@ void CallRegisteredLuaMemHook(unsigned int address, int size, unsigned int value
CallRegisteredLuaMemHook_LuaMatch(address, size, value, hookType); // something has hooked this specific address
}
}
*/
void CallRegisteredLuaFunctions(LuaCallID calltype)

View File

@ -407,12 +407,16 @@ void FCEUI_StopMovie()
//begin playing an existing movie
void _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)
const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe)
{
//if(!tasedit && !FCEU_IsValidUI(FCEUI_PLAYMOVIE))
// return;
// FIXME: name==null indicates to BROWSE to retrieve fname from user (or stdin if that's impossible),
// when called from movie_play
assert(fname);
if(!fname)
return "LoadMovie doesn't support browsing yet";
//mbg 6/10/08 - we used to call StopMovie here, but that cleared curMovieFilename and gave us crashes...
if(movieMode == MOVIEMODE_PLAY)
@ -433,12 +437,13 @@ void _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, i
//LoadFM2(currMovieData, fp->stream, INT_MAX, false);
bool loadedfm2 = false;
bool opened = false;
{
fstream fs (fname);
if(fs.is_open())
{
LoadFM2(currMovieData, &fs, INT_MAX, false);
loadedfm2 = LoadFM2(currMovieData, &fs, INT_MAX, false);
opened = true;
}
fs.close();
@ -447,10 +452,13 @@ void _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, i
{
// for some reason fs.open doesn't work, it has to be a whole new fstream object
fstream fs (fname, std::ios_base::in);
LoadFM2(currMovieData, &fs, INT_MAX, false);
loadedfm2 = LoadFM2(currMovieData, &fs, INT_MAX, false);
fs.close();
}
if(!loadedfm2)
return "failed to load movie";
//TODO
//fully reload the game to reinitialize everything before playing any movie
//poweron(true);
@ -478,7 +486,7 @@ void _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, i
if(currMovieData.sram.size() != 0)
{
bool success = MovieData::loadSramFrom(&currMovieData.sram);
if(!success) return;
if(!success) return "failed to load sram";
}
freshMovie = true;
ClearAutoHold();
@ -487,6 +495,8 @@ void _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, i
driver->USR_InfoMessage("Replay started Read-Only.");
else
driver->USR_InfoMessage("Replay started Read+Write.");
return NULL; // success
}
static void openRecordingMovie(const char* fname)

View File

@ -194,7 +194,7 @@ extern bool movie_reset_command;
bool FCEUI_MovieGetInfo(std::istream* fp, MOVIE_INFO& info, bool skipFrameCount);
void _CDECL_ FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, std::string sramfname);
void _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe);
const char* _CDECL_ FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _pauseframe); // returns NULL on success, errmsg on failure
void FCEUI_StopMovie();
void FCEUMOV_AddInputState();
void FCEUMOV_HandlePlayback();

View File

@ -439,6 +439,34 @@ void SetMinWindowSize()
MainWindow->setMinSize(video.rotatedwidthgap(), video.rotatedheightgap());
}
void UnscaleScreenCoords(s32& x, s32& y)
{
RECT r;
HWND hwnd = MainWindow->getHWnd();
GetClientRect(hwnd,&r);
SetCapture(hwnd);
int defwidth = video.width, defheight = (video.height+video.screengap);
int winwidth = (r.right-r.left), winheight = (r.bottom-r.top);
// translate from scaling (screen resolution to 256x384 or 512x192)
switch (video.rotation)
{
case 0:
case 180:
x = (x*defwidth) / winwidth;
y = (y*defheight) / winheight;
break ;
case 90:
case 270:
x = (x*defheight) / winwidth;
y = (y*defwidth) / winheight;
break ;
}
x = x/video.ratio();
y = y/video.ratio();
}
// input x,y should be windows client-space coords already at 1x scaling.
// output is in pixels relative to the top-left of the chosen screen.
// the gap between screens (if any) is subtracted away from the output y.
@ -3065,31 +3093,10 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case WM_LBUTTONDBLCLK:
if (wParam & MK_LBUTTON)
{
RECT r ;
s32 x = (s32)((s16)LOWORD(lParam));
s32 y = (s32)((s16)HIWORD(lParam));
GetClientRect(hwnd,&r);
SetCapture(hwnd);
int defwidth = video.width, defheight = (video.height+video.screengap);
int winwidth = (r.right-r.left), winheight = (r.bottom-r.top);
// translate from scaling (screen resolution to 256x384 or 512x192)
switch (video.rotation)
{
case 0:
case 180:
x = (x*defwidth) / winwidth;
y = (y*defheight) / winheight;
break ;
case 90:
case 270:
x = (x*defheight) / winwidth;
y = (y*defwidth) / winheight;
break ;
}
x = x/video.ratio();
y = y/video.ratio();
UnscaleScreenCoords(x,y);
if(HudEditorMode)
{