From 36ea0b4d7e3ed467022bc8124b953271f81922de Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Thu, 16 Nov 2023 19:10:57 -0600 Subject: [PATCH] Fixed controllers being lost when using the menu. --- .gitignore | 1 + .idea/.gitignore | 8 - .idea/.name | 1 - .idea/codeStyles/codeStyleConfig.xml | 5 - .idea/misc.xml | 4 - .idea/modules.xml | 8 - .idea/singe2.iml | 2 - .idea/vcs.xml | 6 - src/main.c | 91 +- src/singe.c | 6778 +++++++++++++------------- 10 files changed, 3443 insertions(+), 3461 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/singe2.iml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index 8fdbe4e62..4127e98b5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ **/.github/ cmake-build-debug/ *.log +*.user diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81b..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index a7142660d..000000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -singe2 \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a179..000000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 79b3c9483..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7ef000f1f..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/singe2.iml b/.idea/singe2.iml deleted file mode 100644 index f08604bb6..000000000 --- a/.idea/singe2.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main.c b/src/main.c index b95fdc731..7d9fc5c45 100644 --- a/src/main.c +++ b/src/main.c @@ -517,29 +517,17 @@ bool extractFile(char *filename, unsigned char *data, int32_t length) { void launcher(char *exeName, ConfigT *conf) { int32_t x = 0; - int32_t err = 0; - int32_t flags = 0; int32_t bestResIndex = -1; float thisRatio = 0; float bestRatio = 9999; + int32_t err = 0; + int32_t flags = 0; char *temp = NULL; SDL_Window *window = NULL; SDL_Renderer *renderer = NULL; SDL_Surface *icon = NULL; SDL_DisplayMode mode; - // Do they want tracing of any kind? - if (conf->scriptTracing || conf->programTracing) { - temp = utilCreateString("%strace.txt", conf->dataDir); - utilTraceStart(temp); - free(temp); - temp = NULL; - } - - // Init SDL - mainTrace("Starting SDL"); - if (SDL_Init(SDL_INIT_EVERYTHING) != 0) utilDie("%s", SDL_GetError()); - // Get current screen resolution if (SDL_GetCurrentDisplayMode(0, &mode) < 0) utilDie("%s", SDL_GetError()); mainTrace("Display is %dx%d", mode.w, mode.h); @@ -614,22 +602,6 @@ void launcher(char *exeName, ConfigT *conf) { if (conf->yResolution <= 0) showUsage(exeName, "Unable to determine Y resolution. (Is the X value sane?)"); if ((conf->xResolution > mode.w) || (conf->yResolution > mode.h)) showUsage(exeName, "Specified resolution is larger than the display."); - // Init SDL_mixer - mainTrace("Starting mixer"); - flags = MIX_INIT_FLAC | MIX_INIT_MID | MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG | MIX_INIT_OPUS | MIX_INIT_WAVPACK; - err = Mix_Init(flags); - if (err != flags) utilDie("%s", Mix_GetError()); - - // Init SDL_image - mainTrace("Starting image loader"); - flags = /* IMG_INIT_AVIF | */ IMG_INIT_JPG | /* IMG_INIT_JXL | */ IMG_INIT_PNG | /* IMG_INIT_TIF | */ IMG_INIT_WEBP; - err = IMG_Init(flags); - if (err != flags) utilDie("%s", IMG_GetError()); - - // Init SDL_ttf - mainTrace("Starting fonts"); - if (TTF_Init() < 0) utilDie("%s", TTF_GetError()); - // Create Window mainTrace("Creating window"); window = SDL_CreateWindow("SINGE", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, conf->xResolution, conf->yResolution, 0 /* SDL_WINDOW_RESIZABLE */); @@ -692,16 +664,6 @@ void launcher(char *exeName, ConfigT *conf) { SDL_DestroyWindow(window); mainTrace("Re-enabling screen saver"); SDL_EnableScreenSaver(); - mainTrace("Shutting down fonts"); - TTF_Quit(); - mainTrace("Shutting down image loader"); - IMG_Quit(); - mainTrace("Shutting down mixer"); - Mix_Quit(); - mainTrace("Shutting down SDL"); - SDL_Quit(); - mainTrace("Shutting down tracing"); - utilTraceEnd(); } @@ -805,6 +767,36 @@ void showUsage(char *name, char *message) { } +void startSDL(void) { + int32_t err = 0; + int32_t flags = 0; + + // Init SDL + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) utilDie("%s", SDL_GetError()); + + // Init SDL_mixer + flags = MIX_INIT_FLAC | MIX_INIT_MID | MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG | MIX_INIT_OPUS | MIX_INIT_WAVPACK; + err = Mix_Init(flags); + if (err != flags) utilDie("%s", Mix_GetError()); + + // Init SDL_image + flags = /* IMG_INIT_AVIF | */ IMG_INIT_JPG | /* IMG_INIT_JXL | */ IMG_INIT_PNG | /* IMG_INIT_TIF | */ IMG_INIT_WEBP; + err = IMG_Init(flags); + if (err != flags) utilDie("%s", IMG_GetError()); + + // Init SDL_ttf + if (TTF_Init() < 0) utilDie("%s", TTF_GetError()); +} + + +void stopSDL(void) { + TTF_Quit(); + IMG_Quit(); + Mix_Quit(); + SDL_Quit(); +} + + void unpackData(char *name) { char *temp = NULL; char *data = NULL; @@ -953,6 +945,7 @@ void unpackGames(void) { int main(int argc, char *argv[]) { char *exeName = (char *)argv[0]; + char *temp = NULL; ConfigT *conf = NULL; QueueT *q = NULL; @@ -964,15 +957,33 @@ int main(int argc, char *argv[]) { queueScript(conf); destroyConf(&conf); + // Do they want tracing of any kind? + + startSDL(); + // Run script queue while (_scriptQueue) { + q = _scriptQueue; + + if (q->conf->scriptTracing || q->conf->programTracing) { + temp = utilCreateString("%strace.txt", q->conf->dataDir); + utilTraceStart(temp); + free(temp); + temp = NULL; + } + launcher(exeName, q->conf); + destroyConf(&q->conf); LL_DELETE(_scriptQueue, q); free(q); + + utilTraceEnd(); } + stopSDL(); + #ifdef _WIN32 if (utilGetConsoleEnabled()) getchar(); #endif diff --git a/src/singe.c b/src/singe.c index 5b0ab1f48..78fe1bf39 100644 --- a/src/singe.c +++ b/src/singe.c @@ -64,167 +64,167 @@ int luaopen_luars232(lua_State *L); #define AXIS_KEY_UP 1 typedef struct MouseS { - int32_t x; - int32_t y; - int32_t relx; - int32_t rely; - char name[64]; - bool connected; + int32_t x; + int32_t y; + int32_t relx; + int32_t rely; + char name[64]; + bool connected; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpadded" - Uint32 buttons; + Uint32 buttons; #pragma GCC diagnostic pop - Uint32 scrolluptick; - Uint32 scrolldowntick; - Uint32 scrolllefttick; - Uint32 scrollrighttick; + Uint32 scrolluptick; + Uint32 scrolldowntick; + Uint32 scrolllefttick; + Uint32 scrollrighttick; } MouseT; typedef struct SpriteS { - int32_t id; + int32_t id; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpadded" - SDL_Surface *surface; + SDL_Surface *surface; #pragma GCC diagnostic pop - UT_hash_handle hh; + UT_hash_handle hh; } SpriteT; typedef struct SoundS { - int32_t id; + int32_t id; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpadded" - Mix_Chunk *chunk; + Mix_Chunk *chunk; #pragma GCC diagnostic pop - UT_hash_handle hh; + UT_hash_handle hh; } SoundT; typedef struct FontS { - int32_t id; + int32_t id; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpadded" - TTF_Font *font; + TTF_Font *font; #pragma GCC diagnostic pop - UT_hash_handle hh; + UT_hash_handle hh; } FontT; typedef struct VideoS { - int32_t id; - int32_t handle; - int64_t lastFrame; - bool wasPlayingBeforePause; - SDL_Texture *texture; - SDL_Surface *surface; - UT_hash_handle hh; + int32_t id; + int32_t handle; + int64_t lastFrame; + bool wasPlayingBeforePause; + SDL_Texture *texture; + SDL_Surface *surface; + UT_hash_handle hh; } VideoT; typedef struct MappingS { - char *name; - int32_t frameworkIndex; - int32_t inputCount; - int32_t *input; + char *name; + int32_t frameworkIndex; + int32_t inputCount; + int32_t *input; } MappingT; enum { - KEYBD_NORMAL = 0, - KEYBD_FULL + KEYBD_NORMAL = 0, + KEYBD_FULL }; enum { - MOUSE_SINGLE = 100, - MOUSE_MANY = 200 + MOUSE_SINGLE = 100, + MOUSE_MANY = 200 }; enum { - LDP_ERROR = 0, - LDP_SEARCHING, - LDP_STOPPED, - LDP_PLAYING, - LDP_PAUSED + LDP_ERROR = 0, + LDP_SEARCHING, + LDP_STOPPED, + LDP_PLAYING, + LDP_PAUSED }; enum { - FONT_QUALITY_SOLID = 1, - FONT_QUALITY_SHADED, - FONT_QUALITY_BLENDED + FONT_QUALITY_SOLID = 1, + FONT_QUALITY_SHADED, + FONT_QUALITY_BLENDED }; enum { - // Index into _global.controlMappings array - INPUT_UP = 0, - INPUT_LEFT, - INPUT_DOWN, - INPUT_RIGHT, - INPUT_1P_START, - INPUT_2P_START, - INPUT_ACTION_1, - INPUT_ACTION_2, - INPUT_ACTION_3, - INPUT_1P_COIN, - INPUT_2P_COIN, - INPUT_SKILL_EASY, - INPUT_SKILL_MEDIUM, - INPUT_SKILL_HARD, - INPUT_SERVICE, - INPUT_TEST_MODE, - INPUT_RESET_CPU, - INPUT_SCREENSHOT, - INPUT_QUIT, - INPUT_PAUSE, - INPUT_CONSOLE, - // Added in Singe 2.x - INPUT_ACTION_4, - INPUT_TILT, - INPUT_GRAB, - INPUT_COUNT + // Index into _global.controlMappings array + INPUT_UP = 0, + INPUT_LEFT, + INPUT_DOWN, + INPUT_RIGHT, + INPUT_1P_START, + INPUT_2P_START, + INPUT_ACTION_1, + INPUT_ACTION_2, + INPUT_ACTION_3, + INPUT_1P_COIN, + INPUT_2P_COIN, + INPUT_SKILL_EASY, + INPUT_SKILL_MEDIUM, + INPUT_SKILL_HARD, + INPUT_SERVICE, + INPUT_TEST_MODE, + INPUT_RESET_CPU, + INPUT_SCREENSHOT, + INPUT_QUIT, + INPUT_PAUSE, + INPUT_CONSOLE, + // Added in Singe 2.x + INPUT_ACTION_4, + INPUT_TILT, + INPUT_GRAB, + INPUT_COUNT }; typedef struct GlobalS { - MouseT mice[MAX_MICE]; - lua_State *luaContext; - SDL_Color colorForeground; - SDL_Color colorBackground; - SDL_Surface *overlay; - SDL_Window *window; - SDL_Renderer *renderer; - SDL_Texture *videoTexture; - SDL_Surface *consoleFontSurface; - SDL_GameController **controllers; - int32_t controllerCount; - int32_t controllerDeadZone; - int32_t consoleFontWidth; - int32_t consoleFontHeight; - int32_t nextSpriteId; - int32_t nextSoundId; - int32_t nextFontId; - int32_t nextVideoId; - int32_t effectsVolume; - int32_t keyboardMode; - int32_t frameFileHandle; - int32_t videoHandle; - int32_t fontQuality; - int32_t mouseMode; - int32_t mouseCount; - int32_t axisCache[AXIS_COUNT]; - double overlayScaleX; // Difference between overlay and video - double overlayScaleY; // Difference between overlay and video - bool pauseState; // by RDG2010 - bool pauseEnabled; // by RDG2010 - bool refreshDisplay; - bool running; - bool discStopped; - bool mouseEnabled; - bool mouseGrabbed; - bool requestScreenShot; - bool wasPlayingBeforePause; - VideoT *videoList; - SpriteT *spriteList; - SoundT *soundList; - FontT *fontList; - FontT *fontCurrent; - MappingT controlMappings[INPUT_COUNT]; - ConfigT *conf; // Local copy of command line options + MouseT mice[MAX_MICE]; + lua_State *luaContext; + SDL_Color colorForeground; + SDL_Color colorBackground; + SDL_Surface *overlay; + SDL_Window *window; + SDL_Renderer *renderer; + SDL_Texture *videoTexture; + SDL_Surface *consoleFontSurface; + SDL_GameController **controllers; + int32_t controllerCount; + int32_t controllerDeadZone; + int32_t consoleFontWidth; + int32_t consoleFontHeight; + int32_t nextSpriteId; + int32_t nextSoundId; + int32_t nextFontId; + int32_t nextVideoId; + int32_t effectsVolume; + int32_t keyboardMode; + int32_t frameFileHandle; + int32_t videoHandle; + int32_t fontQuality; + int32_t mouseMode; + int32_t mouseCount; + int32_t axisCache[AXIS_COUNT]; + double overlayScaleX; // Difference between overlay and video + double overlayScaleY; // Difference between overlay and video + bool pauseState; // by RDG2010 + bool pauseEnabled; // by RDG2010 + bool refreshDisplay; + bool running; + bool discStopped; + bool mouseEnabled; + bool mouseGrabbed; + bool requestScreenShot; + bool wasPlayingBeforePause; + VideoT *videoList; + SpriteT *spriteList; + SoundT *soundList; + FontT *fontList; + FontT *fontCurrent; + MappingT controlMappings[INPUT_COUNT]; + ConfigT *conf; // Local copy of command line options } GlobalT; @@ -364,4147 +364,4151 @@ void luaStackDump(lua_State *L); #endif int32_t apiColorBackground(lua_State *L) { - int32_t n = lua_gettop(L); - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + double d = 0; + bool result = false; - if ((n == 3) || (n == 4)) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - d = lua_tonumber(L, 1); _global.colorBackground.r = (byte)d; - d = lua_tonumber(L, 2); _global.colorBackground.g = (byte)d; - d = lua_tonumber(L, 3); _global.colorBackground.b = (byte)d; - if (n == 3) { - _global.colorBackground.a = (byte)0; // Default to transparent. - } else { - if (lua_isnumber(L, 4)) { - d = lua_tonumber(L, 4); _global.colorBackground.a = (byte)d; - } else { - _global.colorBackground.a = (byte)0; // Default to transparent. - } - } - result = true; - } - } - } - } + if ((n == 3) || (n == 4)) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + d = lua_tonumber(L, 1); _global.colorBackground.r = (byte)d; + d = lua_tonumber(L, 2); _global.colorBackground.g = (byte)d; + d = lua_tonumber(L, 3); _global.colorBackground.b = (byte)d; + if (n == 3) { + _global.colorBackground.a = (byte)0; // Default to transparent. + } else { + if (lua_isnumber(L, 4)) { + d = lua_tonumber(L, 4); _global.colorBackground.a = (byte)d; + } else { + _global.colorBackground.a = (byte)0; // Default to transparent. + } + } + result = true; + } + } + } + } - if (result) { - luaTrace(L, "colorBackground", "%d %d %d %d", _global.colorBackground.r, _global.colorBackground.g, _global.colorBackground.b, _global.colorBackground.a); - } else { - luaDie(L, "colorBackground", "Failed!"); - } + if (result) { + luaTrace(L, "colorBackground", "%d %d %d %d", _global.colorBackground.r, _global.colorBackground.g, _global.colorBackground.b, _global.colorBackground.a); + } else { + luaDie(L, "colorBackground", "Failed!"); + } - return 0; + return 0; } int32_t apiColorForeground(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + bool result = false; + double d = 0; - if ((n == 3) || (n == 4)) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - d = lua_tonumber(L, 1); _global.colorForeground.r = (byte)d; - d = lua_tonumber(L, 2); _global.colorForeground.g = (byte)d; - d = lua_tonumber(L, 3); _global.colorForeground.b = (byte)d; - if (n == 3) { - _global.colorForeground.a = (byte)255; // Default to opaque. - } else { - if (lua_isnumber(L, 4)) { - d = lua_tonumber(L, 4); _global.colorForeground.a = (byte)d; - } else { - _global.colorForeground.a = (byte)255; // Default to opaque. - } - } - result = true; - } - } - } - } + if ((n == 3) || (n == 4)) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + d = lua_tonumber(L, 1); _global.colorForeground.r = (byte)d; + d = lua_tonumber(L, 2); _global.colorForeground.g = (byte)d; + d = lua_tonumber(L, 3); _global.colorForeground.b = (byte)d; + if (n == 3) { + _global.colorForeground.a = (byte)255; // Default to opaque. + } else { + if (lua_isnumber(L, 4)) { + d = lua_tonumber(L, 4); _global.colorForeground.a = (byte)d; + } else { + _global.colorForeground.a = (byte)255; // Default to opaque. + } + } + result = true; + } + } + } + } - if (result) { - luaTrace(L, "colorForeground", "%d %d %d %d", _global.colorForeground.r, _global.colorForeground.g, _global.colorForeground.b, _global.colorForeground.a); - } else { - luaDie(L, "colorForeground", "Failed!"); - } + if (result) { + luaTrace(L, "colorForeground", "%d %d %d %d", _global.colorForeground.r, _global.colorForeground.g, _global.colorForeground.b, _global.colorForeground.a); + } else { + luaDie(L, "colorForeground", "Failed!"); + } - return 0; + return 0; } int32_t apiControllerGetAxis(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t c = 0; - int32_t a = 0; - int32_t v = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t c = 0; + int32_t a = 0; + int32_t v = 0; + double d = 0; + bool result = false; - if (n == 2) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - d = lua_tonumber(L, 1); c = (int32_t)d; - d = lua_tonumber(L, 2); a = (int32_t)d; - if ((c < 0) || (c >= MAX_CONTROLLERS)) luaDie(L, "controllerGetAxis", "Invalid controller index: %d", c); - if ((a < 0) || (a >= CONTROLLER_AXIS_COUNT)) luaDie(L, "controllerGetAxis", "Invalid controller axis: %d", a); - v = _global.axisCache[c * CONTROLLER_AXIS_COUNT + a]; - result = true; - } - } - } + if (n == 2) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + d = lua_tonumber(L, 1); c = (int32_t)d; + d = lua_tonumber(L, 2); a = (int32_t)d; + if ((c < 0) || (c >= MAX_CONTROLLERS)) luaDie(L, "controllerGetAxis", "Invalid controller index: %d", c); + if ((a < 0) || (a >= CONTROLLER_AXIS_COUNT)) luaDie(L, "controllerGetAxis", "Invalid controller axis: %d", a); + v = _global.axisCache[c * CONTROLLER_AXIS_COUNT + a]; + result = true; + } + } + } - if (result) { - luaTrace(L, "controllerGetAxis", "%d %d %d", c, a, v); - lua_pushinteger(L, v); - } else { - luaDie(L, "controllerGetAxis", "Failed!"); - } + if (result) { + luaTrace(L, "controllerGetAxis", "%d %d %d", c, a, v); + lua_pushinteger(L, v); + } else { + luaDie(L, "controllerGetAxis", "Failed!"); + } - return 1; + return 1; } int32_t apiSingeGetHeight(lua_State *L) { - int32_t y; - SDL_GetWindowSize(_global.window, NULL, &y); - luaTrace(L, "singeGetHeight", "%d", y); - lua_pushinteger(L, y); - return 1; + int32_t y; + SDL_GetWindowSize(_global.window, NULL, &y); + luaTrace(L, "singeGetHeight", "%d", y); + lua_pushinteger(L, y); + return 1; } int32_t apiSingeGetWidth(lua_State *L) { - int32_t x; - SDL_GetWindowSize(_global.window, &x, NULL); - luaTrace(L, "singeGetWidth", "%d", x); - lua_pushinteger(L, x); - return 1; + int32_t x; + SDL_GetWindowSize(_global.window, &x, NULL); + luaTrace(L, "singeGetWidth", "%d", x); + lua_pushinteger(L, x); + return 1; } int32_t apiSingeScreenshot(lua_State *L) { - luaTrace(L, "singeScreenshot", "Screenshot requested."); - _global.requestScreenShot = true; + luaTrace(L, "singeScreenshot", "Screenshot requested."); + _global.requestScreenShot = true; - return 0; + return 0; } int32_t apiDebugPrint(lua_State *L) { - int32_t n = lua_gettop(L); + int32_t n = lua_gettop(L); - if (n == 1) { - if (lua_isstring(L, 1)) { - luaTrace(L, "DebugPrint", "%s", lua_tostring(L, 1)); - utilSay("%s", lua_tostring(L, 1)); - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + luaTrace(L, "DebugPrint", "%s", lua_tostring(L, 1)); + utilSay("%s", lua_tostring(L, 1)); + } + } - return 0; + return 0; } int32_t apiDiscAudio(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t channel = 0; - int32_t left = 0; - int32_t right = 0; - bool onOff = false; - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + int32_t channel = 0; + int32_t left = 0; + int32_t right = 0; + bool onOff = false; + bool result = false; + double d = 0; - if (n == 2) { - if (lua_isnumber(L, 1)) { - if (lua_isboolean(L, 2)) { - if (_global.videoHandle >= 0) { - d = lua_tonumber(L, 1); channel = (int32_t)d; - d = lua_toboolean(L, 2); onOff = (bool)d; - videoGetVolume(_global.videoHandle, &left, &right); - if (channel == 1) left = (onOff ? _global.conf->volumeVldp : 0); - if (channel == 2) right = (onOff ? _global.conf->volumeVldp : 0); - videoSetVolume(_global.videoHandle, left, right); - result = true; - } - } - } - } + if (n == 2) { + if (lua_isnumber(L, 1)) { + if (lua_isboolean(L, 2)) { + if (_global.videoHandle >= 0) { + d = lua_tonumber(L, 1); channel = (int32_t)d; + d = lua_toboolean(L, 2); onOff = (bool)d; + videoGetVolume(_global.videoHandle, &left, &right); + if (channel == 1) left = (onOff ? _global.conf->volumeVldp : 0); + if (channel == 2) right = (onOff ? _global.conf->volumeVldp : 0); + videoSetVolume(_global.videoHandle, left, right); + result = true; + } + } + } + } - if (result) { - luaTrace(L, "discAudio", "%d %d", left, right); - } else { - luaDie(L, "discAudio", "Failed!"); - } + if (result) { + luaTrace(L, "discAudio", "%d %d", left, right); + } else { + luaDie(L, "discAudio", "Failed!"); + } - return 0; + return 0; } int32_t apiDiscChangeSpeed(lua_State *L) { - (void)L; - //***REMOVED*** - luaTrace(L, "discChangeSpeed", "Unimplemented"); - return 0; + (void)L; + //***REMOVED*** + luaTrace(L, "discChangeSpeed", "Unimplemented"); + return 0; } int32_t apiDiscGetFrame(lua_State *L) { - int64_t frame = 0; + int64_t frame = 0; - if (!_global.discStopped) { - if (_global.conf->isFrameFile) { - frame = frameFileGetFrame(_global.frameFileHandle, _global.videoHandle); - } else { - if (_global.videoHandle >= 0) frame = videoGetFrame(_global.videoHandle); - } - } + if (!_global.discStopped) { + if (_global.conf->isFrameFile) { + frame = frameFileGetFrame(_global.frameFileHandle, _global.videoHandle); + } else { + if (_global.videoHandle >= 0) frame = videoGetFrame(_global.videoHandle); + } + } - luaTrace(L, "discGetFrame", "%ld", frame); - lua_pushinteger(L, frame); + luaTrace(L, "discGetFrame", "%ld", frame); + lua_pushinteger(L, frame); - return 1; + return 1; } int32_t apiDiscPause(lua_State *L) { - (void)L; - if (!_global.discStopped) { - if (_global.videoHandle >= 0) videoPause(_global.videoHandle); - luaTrace(L, "discPause", ""); - } else { - luaTrace(L, "discPause", "Failed! Disc is stopped."); - } - return 0; + (void)L; + if (!_global.discStopped) { + if (_global.videoHandle >= 0) videoPause(_global.videoHandle); + luaTrace(L, "discPause", ""); + } else { + luaTrace(L, "discPause", "Failed! Disc is stopped."); + } + return 0; } int32_t apiDiscPauseAtFrame(lua_State *L) { - // More RDG oddness. This appears to be identical to discSearch. - return apiDiscSearch(L); + // More RDG oddness. This appears to be identical to discSearch. + return apiDiscSearch(L); } int32_t apiDiscPlay(lua_State *L) { - (void)L; - if (_global.videoHandle >= 0) videoPlay(_global.videoHandle); - _global.discStopped = false; - luaTrace(L, "discPlay", ""); - return 0; + (void)L; + if (_global.videoHandle >= 0) videoPlay(_global.videoHandle); + _global.discStopped = false; + luaTrace(L, "discPlay", ""); + return 0; } int32_t apiDiscSearch(lua_State *L) { - int32_t n = lua_gettop(L); - int64_t frame = 0; - int64_t aFrame = 0; - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + int64_t frame = 0; + int64_t aFrame = 0; + bool result = false; + double d = 0; - // No matter the disc state, seek to the frame, display it, and pause. + // No matter the disc state, seek to the frame, display it, and pause. - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); frame = (int64_t)d; - if (_global.conf->isFrameFile) { - frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); - } else { - if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); - } - if (_global.videoHandle >= 0) videoPause(_global.videoHandle); - _global.discStopped = false; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); frame = (int64_t)d; + if (_global.conf->isFrameFile) { + frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); + } else { + if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); + } + if (_global.videoHandle >= 0) videoPause(_global.videoHandle); + _global.discStopped = false; + result = true; + } + } - if (result) { - luaTrace(L, "discSearch", "%ld", frame); - } else { - luaDie(L, "discSearch", "Failed!"); - } + if (result) { + luaTrace(L, "discSearch", "%ld", frame); + } else { + luaDie(L, "discSearch", "Failed!"); + } - return 0; + return 0; } int32_t apiDiscSearchBlanking(lua_State *L) { - (void)L; - //***REMOVED*** - luaTrace(L, "discSearchBlanking", "Unimplemented"); - return 0; + (void)L; + //***REMOVED*** + luaTrace(L, "discSearchBlanking", "Unimplemented"); + return 0; } int32_t apiDiscSetFps(lua_State *L) { - (void)L; - //***REMOVED*** - luaTrace(L, "discSetFPS", "Unimplemented"); - return 0; + (void)L; + //***REMOVED*** + luaTrace(L, "discSetFPS", "Unimplemented"); + return 0; } int32_t apiDiscSkipBackward(lua_State *L) { - int32_t n = lua_gettop(L); - int64_t frame = 0; - int64_t aFrame = 0; - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + int64_t frame = 0; + int64_t aFrame = 0; + bool result = false; + double d = 0; - // If disc is not stopped, seek backwards to given frame. Do not change play/pause state. + // If disc is not stopped, seek backwards to given frame. Do not change play/pause state. - if (!_global.discStopped) { - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); - if (_global.videoHandle >= 0) frame = videoGetFrame(_global.videoHandle) - (int64_t)d; - if (_global.conf->isFrameFile) { - frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); - } else { - if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); - } - result = true; - } - } - } else { - luaDie(L, "discSkipBackward", "Failed! Disc is stopped."); - return 0; - } + if (!_global.discStopped) { + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); + if (_global.videoHandle >= 0) frame = videoGetFrame(_global.videoHandle) - (int64_t)d; + if (_global.conf->isFrameFile) { + frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); + } else { + if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); + } + result = true; + } + } + } else { + luaDie(L, "discSkipBackward", "Failed! Disc is stopped."); + return 0; + } - if (result) { - luaTrace(L, "discSkipBackward", "%ld", frame); - } else { - luaDie(L, "discSkipBackward", "Failed!"); - } + if (result) { + luaTrace(L, "discSkipBackward", "%ld", frame); + } else { + luaDie(L, "discSkipBackward", "Failed!"); + } - return 0; + return 0; } int32_t apiDiscSkipBlanking(lua_State *L) { - (void)L; - //***REMOVED*** - luaTrace(L, "discSkipBlanking", "Unimplemented"); - return 0; + (void)L; + //***REMOVED*** + luaTrace(L, "discSkipBlanking", "Unimplemented"); + return 0; } int32_t apiDiscSkipForward(lua_State *L) { - int32_t n = lua_gettop(L); - int64_t frame = 0; - int64_t aFrame = 0; - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + int64_t frame = 0; + int64_t aFrame = 0; + bool result = false; + double d = 0; - // If disc is not stopped, seek ahead to given frame. Do not change play/pause state. + // If disc is not stopped, seek ahead to given frame. Do not change play/pause state. - if (!_global.discStopped) { - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); if (_global.videoHandle >= 0) frame = videoGetFrame(_global.videoHandle) + (int64_t)d; - if (_global.conf->isFrameFile) { - frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); - } else { - if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); - } - result = true; - } - } - } else { - luaTrace(L, "discSkipForward", "Failed! Disc is stopped."); - return 0; - } + if (!_global.discStopped) { + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); if (_global.videoHandle >= 0) frame = videoGetFrame(_global.videoHandle) + (int64_t)d; + if (_global.conf->isFrameFile) { + frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); + } else { + if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); + } + result = true; + } + } + } else { + luaTrace(L, "discSkipForward", "Failed! Disc is stopped."); + return 0; + } - if (result) { - luaTrace(L, "discSkipForward", "%ld", frame); - } else { - luaDie(L, "discSkipForward", "Failed!"); - } + if (result) { + luaTrace(L, "discSkipForward", "%ld", frame); + } else { + luaDie(L, "discSkipForward", "Failed!"); + } - return 0; + return 0; } int32_t apiDiscSkipToFrame(lua_State *L) { - int32_t n = lua_gettop(L); - int64_t frame = 0; - int64_t aFrame = 0; - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + int64_t frame = 0; + int64_t aFrame = 0; + bool result = false; + double d = 0; - // No matter disc state, seek to given frame and play. + // No matter disc state, seek to given frame and play. - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); frame = (int64_t)d; - if (_global.conf->isFrameFile) { - frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); - } else { - if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); - } - if (_global.videoHandle >= 0) videoPlay(_global.videoHandle); - _global.discStopped = false; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); frame = (int64_t)d; + if (_global.conf->isFrameFile) { + frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); + } else { + if (_global.videoHandle >= 0) videoSeek(_global.videoHandle, frame); + } + if (_global.videoHandle >= 0) videoPlay(_global.videoHandle); + _global.discStopped = false; + result = true; + } + } - if (result) { - luaTrace(L, "discSkipToFrame", "%ld", frame); - } else { - luaDie(L, "discSkipToFrame", "Failed!"); - } + if (result) { + luaTrace(L, "discSkipToFrame", "%ld", frame); + } else { + luaDie(L, "discSkipToFrame", "Failed!"); + } - return 0; + return 0; } int32_t apiDiscStepBackward(lua_State *L) { - int64_t frame = 0; - int64_t aFrame = 0; + int64_t frame = 0; + int64_t aFrame = 0; - (void)L; + (void)L; - // No matter disc state, go back a frame. If playing, pause. + // No matter disc state, go back a frame. If playing, pause. - if (_global.videoHandle >= 0) { - if (_global.conf->isFrameFile) { - frame = frameFileGetFrame(_global.frameFileHandle, _global.videoHandle) - 1; - frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); - } else { - frame = videoGetFrame(_global.videoHandle) - 1; - videoSeek(_global.videoHandle, frame); - } - videoPause(_global.videoHandle); - } - luaTrace(L, "discStepBackward", "%ld", frame); + if (_global.videoHandle >= 0) { + if (_global.conf->isFrameFile) { + frame = frameFileGetFrame(_global.frameFileHandle, _global.videoHandle) - 1; + frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); + } else { + frame = videoGetFrame(_global.videoHandle) - 1; + videoSeek(_global.videoHandle, frame); + } + videoPause(_global.videoHandle); + } + luaTrace(L, "discStepBackward", "%ld", frame); - return 0; + return 0; } int32_t apiDiscStepForward(lua_State *L) { - int64_t frame = 0; - int64_t aFrame = 0; + int64_t frame = 0; + int64_t aFrame = 0; - (void)L; + (void)L; - // No matter disc state, go forward a frame. If playing, pause. + // No matter disc state, go forward a frame. If playing, pause. - if (_global.videoHandle >= 0) { - if (_global.conf->isFrameFile) { - frame = frameFileGetFrame(_global.frameFileHandle, _global.videoHandle) + 1; - frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); - } else { - frame = videoGetFrame(_global.videoHandle) + 1; - videoSeek(_global.videoHandle, frame); - } - videoPause(_global.videoHandle); - } - luaTrace(L, "discStepForward", "%ld", frame); + if (_global.videoHandle >= 0) { + if (_global.conf->isFrameFile) { + frame = frameFileGetFrame(_global.frameFileHandle, _global.videoHandle) + 1; + frameFileSeek(_global.frameFileHandle, frame, &_global.videoHandle, &aFrame); + } else { + frame = videoGetFrame(_global.videoHandle) + 1; + videoSeek(_global.videoHandle, frame); + } + videoPause(_global.videoHandle); + } + luaTrace(L, "discStepForward", "%ld", frame); - return 0; + return 0; } int32_t apiDiscStop(lua_State *L) { - (void)L; - if (!_global.discStopped) { - if (_global.videoHandle >= 0) videoPause(_global.videoHandle); - _global.discStopped = true; - _global.refreshDisplay = true; - luaTrace(L, "discStop", ""); - } else { - luaTrace(L, "discStop", "Failed! Disc is stopped."); - } - return 0; + (void)L; + if (!_global.discStopped) { + if (_global.videoHandle >= 0) videoPause(_global.videoHandle); + _global.discStopped = true; + _global.refreshDisplay = true; + luaTrace(L, "discStop", ""); + } else { + luaTrace(L, "discStop", "Failed! Disc is stopped."); + } + return 0; } int32_t apiFontLoad(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t result = -1; - int32_t points = 0; - const char *name = NULL; - double d = 0; - FontT *font = NULL; + int32_t n = lua_gettop(L); + int32_t result = -1; + int32_t points = 0; + const char *name = NULL; + double d = 0; + FontT *font = NULL; - if (n == 2) { - if (lua_isstring(L, 1)) { - if (lua_isnumber(L, 2)) { - name = lua_tostring(L, 1); - d = lua_tonumber(L, 2); points = (int32_t)d; - font = (FontT *)calloc(1, sizeof(FontT)); - if (!font) luaDie(L, "fontLoad", "Unable to allocate new font."); - // Load this font. - font->font = TTF_OpenFont(name, points); - if (!font->font) luaDie(L, "fontLoad", "%s", TTF_GetError()); - // Make it the current font and mark it as loaded. - font->id = _global.nextFontId; - result = _global.nextFontId++; - _global.fontCurrent = font; - HASH_ADD_INT(_global.fontList, id, font); - } - } - } + if (n == 2) { + if (lua_isstring(L, 1)) { + if (lua_isnumber(L, 2)) { + name = lua_tostring(L, 1); + d = lua_tonumber(L, 2); points = (int32_t)d; + font = (FontT *)calloc(1, sizeof(FontT)); + if (!font) luaDie(L, "fontLoad", "Unable to allocate new font."); + // Load this font. + font->font = TTF_OpenFont(name, points); + if (!font->font) luaDie(L, "fontLoad", "%s", TTF_GetError()); + // Make it the current font and mark it as loaded. + font->id = _global.nextFontId; + result = _global.nextFontId++; + _global.fontCurrent = font; + HASH_ADD_INT(_global.fontList, id, font); + } + } + } - if (result >= 0) { - luaTrace(L, "fontLoad", "%s %d", name, result); - } else { - luaDie(L, "fontLoad", "Failed!"); - } + if (result >= 0) { + luaTrace(L, "fontLoad", "%s %d", name, result); + } else { + luaDie(L, "fontLoad", "Failed!"); + } - lua_pushnumber(L, result); - return 1; + lua_pushnumber(L, result); + return 1; } int32_t apiFontPrint(lua_State *L) { - int32_t n = lua_gettop(L); - const char *message = NULL; - double d = 0; - SDL_Surface *textSurface = NULL; - SDL_Rect dest; + int32_t n = lua_gettop(L); + const char *message = NULL; + double d = 0; + SDL_Surface *textSurface = NULL; + SDL_Rect dest; - if (n == 3) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isstring(L, 3)) { - if (_global.fontCurrent) { - d = lua_tonumber(L, 1); dest.x = (int32_t)d; - d = lua_tonumber(L, 2); dest.y = (int32_t)d; - textSurface = NULL; - message = lua_tostring(L, 3); - switch (_global.fontQuality) { - case FONT_QUALITY_SOLID: - textSurface = TTF_RenderText_Solid(_global.fontCurrent->font, message, _global.colorForeground); - break; + if (n == 3) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isstring(L, 3)) { + if (_global.fontCurrent) { + d = lua_tonumber(L, 1); dest.x = (int32_t)d; + d = lua_tonumber(L, 2); dest.y = (int32_t)d; + textSurface = NULL; + message = lua_tostring(L, 3); + switch (_global.fontQuality) { + case FONT_QUALITY_SOLID: + textSurface = TTF_RenderText_Solid(_global.fontCurrent->font, message, _global.colorForeground); + break; - case FONT_QUALITY_SHADED: - textSurface = TTF_RenderText_Shaded(_global.fontCurrent->font, message, _global.colorForeground, _global.colorBackground); - break; + case FONT_QUALITY_SHADED: + textSurface = TTF_RenderText_Shaded(_global.fontCurrent->font, message, _global.colorForeground, _global.colorBackground); + break; - case FONT_QUALITY_BLENDED: - textSurface = TTF_RenderText_Blended(_global.fontCurrent->font, message, _global.colorForeground); - break; + case FONT_QUALITY_BLENDED: + textSurface = TTF_RenderText_Blended(_global.fontCurrent->font, message, _global.colorForeground); + break; - default: - luaDie(L, "fontPrint", "Unknown font quality!"); - break; - } - if (!textSurface) { - luaDie(L, "fontPrint", "Font surface is null!"); - } else { - SDL_SetColorKey(textSurface, true, 0); - dest.w = textSurface->w; - dest.h = textSurface->h; - SDL_BlitSurface(textSurface, NULL, _global.overlay, &dest); - SDL_FreeSurface(textSurface); - } - } - } - } - } - } + default: + luaDie(L, "fontPrint", "Unknown font quality!"); + break; + } + if (!textSurface) { + luaDie(L, "fontPrint", "Font surface is null!"); + } else { + SDL_SetColorKey(textSurface, true, 0); + dest.w = textSurface->w; + dest.h = textSurface->h; + SDL_BlitSurface(textSurface, NULL, _global.overlay, &dest); + SDL_FreeSurface(textSurface); + } + } + } + } + } + } - if (textSurface) { - luaTrace(L, "fontPrint", "%s", message); - } else { - luaDie(L, "fontPrint", "Failed!"); - } + if (textSurface) { + luaTrace(L, "fontPrint", "%s", message); + } else { + luaDie(L, "fontPrint", "Failed!"); + } - return 0; + return 0; } int32_t apiFontQuality(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - double d = 0; + int32_t n = lua_gettop(L); + bool result = false; + double d = 0; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); _global.fontQuality = (int32_t)d; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); _global.fontQuality = (int32_t)d; + result = true; + } + } - if (result) { - luaTrace(L, "fontQuality", "%d", _global.fontQuality); - } else { - luaDie(L, "fontQuality", "Failed!"); - } + if (result) { + luaTrace(L, "fontQuality", "%d", _global.fontQuality); + } else { + luaDie(L, "fontQuality", "Failed!"); + } - return 0; + return 0; } int32_t apiFontSelect(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t id = -1; - double d = 0; - bool result = false; - FontT *font = NULL; + int32_t n = lua_gettop(L); + int32_t id = -1; + double d = 0; + bool result = false; + FontT *font = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); - id = (int32_t)d; - HASH_FIND_INT(_global.fontList, &id, font); - if (!font) luaDie(L, "fontSelect", "No font at index %d in apiFontSelect.", id); - _global.fontCurrent = font; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); + id = (int32_t)d; + HASH_FIND_INT(_global.fontList, &id, font); + if (!font) luaDie(L, "fontSelect", "No font at index %d in apiFontSelect.", id); + _global.fontCurrent = font; + result = true; + } + } - if (result) { - luaTrace(L, "fontSelect", "%d", _global.fontCurrent->id); - } else { - luaDie(L, "fontSelect", "Failed!"); - } + if (result) { + luaTrace(L, "fontSelect", "%d", _global.fontCurrent->id); + } else { + luaDie(L, "fontSelect", "Failed!"); + } - return 0; + return 0; } int32_t apiFontUnload(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - double d; - FontT *font = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + double d; + FontT *font = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our font structure - HASH_FIND_INT(_global.fontList, &id, font); - if (!font) luaDie(L, "fontUnload", "No font at index %d in apiFontUnload.", id); - HASH_DEL(_global.fontList, font); - TTF_CloseFont(font->font); - free(font); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our font structure + HASH_FIND_INT(_global.fontList, &id, font); + if (!font) luaDie(L, "fontUnload", "No font at index %d in apiFontUnload.", id); + HASH_DEL(_global.fontList, font); + TTF_CloseFont(font->font); + free(font); + result = true; + } + } - if (result) { - luaTrace(L, "fontUnload", "%d", id); - } else { - luaDie(L, "fontUnload", "Failed!"); - } + if (result) { + luaTrace(L, "fontUnload", "%d", id); + } else { + luaDie(L, "fontUnload", "Failed!"); + } - return 0; + return 0; } int32_t apiFontToSprite(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t result = -1; - const char *message = NULL; - SpriteT *sprite = NULL; + int32_t n = lua_gettop(L); + int32_t result = -1; + const char *message = NULL; + SpriteT *sprite = NULL; - if (n == 1) { - if (lua_isstring(L, 1)) { - if (_global.fontCurrent) { - // Create spirte - sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); - if (!sprite) luaDie(L, "fontToSprite", "Unable to allocate new text sprite."); - message = lua_tostring(L, 1); - switch (_global.fontQuality) { - case 1: - sprite->surface = TTF_RenderText_Solid(_global.fontCurrent->font, message, _global.colorForeground); - break; + if (n == 1) { + if (lua_isstring(L, 1)) { + if (_global.fontCurrent) { + // Create spirte + sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); + if (!sprite) luaDie(L, "fontToSprite", "Unable to allocate new text sprite."); + message = lua_tostring(L, 1); + switch (_global.fontQuality) { + case 1: + sprite->surface = TTF_RenderText_Solid(_global.fontCurrent->font, message, _global.colorForeground); + break; - case 2: - sprite->surface = TTF_RenderText_Shaded(_global.fontCurrent->font, message, _global.colorForeground, _global.colorBackground); - break; + case 2: + sprite->surface = TTF_RenderText_Shaded(_global.fontCurrent->font, message, _global.colorForeground, _global.colorBackground); + break; - case 3: - sprite->surface = TTF_RenderText_Blended(_global.fontCurrent->font, message, _global.colorForeground); - break; + case 3: + sprite->surface = TTF_RenderText_Blended(_global.fontCurrent->font, message, _global.colorForeground); + break; - default: - luaDie(L, "fontToSprite", "Unknown font quality!"); - break; - } + default: + luaDie(L, "fontToSprite", "Unknown font quality!"); + break; + } - if (!sprite->surface) { - luaDie(L, "fontToSprite", "Font surface is null!"); - } else { - SDL_SetColorKey(sprite->surface, true, 0); - sprite->id = _global.nextSpriteId; - result = _global.nextSpriteId++; - HASH_ADD_INT(_global.spriteList, id, sprite); - } - } - } - } + if (!sprite->surface) { + luaDie(L, "fontToSprite", "Font surface is null!"); + } else { + SDL_SetColorKey(sprite->surface, true, 0); + sprite->id = _global.nextSpriteId; + result = _global.nextSpriteId++; + HASH_ADD_INT(_global.spriteList, id, sprite); + } + } + } + } - if (sprite->surface) { - luaTrace(L, "fontToSprite", "%d %s", result, message); - } else { - luaDie(L, "fontToSprite", "Failed!"); - } + if (sprite->surface) { + luaTrace(L, "fontToSprite", "%d %s", result, message); + } else { + luaDie(L, "fontToSprite", "Failed!"); + } - lua_pushinteger(L, result); - return 1; + lua_pushinteger(L, result); + return 1; } int32_t apiOverlayBox(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t x1 = 0; - int32_t y1 = 0; - int32_t x2 = 0; - int32_t y2 = 0; - //SDL_Rect r; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t x1 = 0; + int32_t y1 = 0; + int32_t x2 = 0; + int32_t y2 = 0; + //SDL_Rect r; + double d = 0; + bool result = false; - if (n == 4) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - if (lua_isnumber(L, 4)) { - d = lua_tonumber(L, 1); x1 = (int32_t)d; - d = lua_tonumber(L, 2); y1 = (int32_t)d; - d = lua_tonumber(L, 3); x2 = (int32_t)d; - d = lua_tonumber(L, 4); y2 = (int32_t)d; + if (n == 4) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + if (lua_isnumber(L, 4)) { + d = lua_tonumber(L, 1); x1 = (int32_t)d; + d = lua_tonumber(L, 2); y1 = (int32_t)d; + d = lua_tonumber(L, 3); x2 = (int32_t)d; + d = lua_tonumber(L, 4); y2 = (int32_t)d; - /* - r.x = x1; - r.y = y1; - r.w = abs(x2 - x1) + 1; - r.h = abs(y2 - y1) + 1; - */ + /* + r.x = x1; + r.y = y1; + r.w = abs(x2 - x1) + 1; + r.h = abs(y2 - y1) + 1; + */ - SDL_LockSurface(_global.overlay); - //***TODO*** No filling until I can find an efficient way to blend individual pixels. - //SDL_FillRect(_global.overlay, &r, SDL_MapRGBA(_global.overlay->format, _global.colorBackground.r, _global.colorBackground.g, _global.colorBackground.b, _global.colorBackground.a)); - line(x1, y1, x2, y1, &_global.colorForeground); - line(x2, y1, x2, y2, &_global.colorForeground); - line(x2, y2, x1, y2, &_global.colorForeground); - line(x1, y2, x1, y1, &_global.colorForeground); - SDL_UnlockSurface(_global.overlay); - result = true; - } - } - } - } - } + SDL_LockSurface(_global.overlay); + //***TODO*** No filling until I can find an efficient way to blend individual pixels. + //SDL_FillRect(_global.overlay, &r, SDL_MapRGBA(_global.overlay->format, _global.colorBackground.r, _global.colorBackground.g, _global.colorBackground.b, _global.colorBackground.a)); + line(x1, y1, x2, y1, &_global.colorForeground); + line(x2, y1, x2, y2, &_global.colorForeground); + line(x2, y2, x1, y2, &_global.colorForeground); + line(x1, y2, x1, y1, &_global.colorForeground); + SDL_UnlockSurface(_global.overlay); + result = true; + } + } + } + } + } - if (result) { - luaTrace(L, "overlayBox", "%d %d %d %d", x1, y1, x2, y2); - } else { - luaDie(L, "overlayBox", "Failed!"); - } + if (result) { + luaTrace(L, "overlayBox", "%d %d %d %d", x1, y1, x2, y2); + } else { + luaDie(L, "overlayBox", "Failed!"); + } - return 0; + return 0; } int32_t apiOverlayCircle(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t x0 = 0; - int32_t y0 = 0; - int32_t r = 0; - int32_t x = 0; - int32_t y = 0; - int32_t ro = 0; - int32_t xo = 0; - int32_t yo = 0; - int32_t dx = 1; - int32_t dy = 1; - int32_t err = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t x0 = 0; + int32_t y0 = 0; + int32_t r = 0; + int32_t x = 0; + int32_t y = 0; + int32_t ro = 0; + int32_t xo = 0; + int32_t yo = 0; + int32_t dx = 1; + int32_t dy = 1; + int32_t err = 0; + double d = 0; + bool result = false; - if (n == 3) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - d = lua_tonumber(L, 1); xo = x = (int32_t)d; - d = lua_tonumber(L, 2); yo = y = (int32_t)d; - d = lua_tonumber(L, 3); ro = r = (int32_t)d; + if (n == 3) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + d = lua_tonumber(L, 1); xo = x = (int32_t)d; + d = lua_tonumber(L, 2); yo = y = (int32_t)d; + d = lua_tonumber(L, 3); ro = r = (int32_t)d; - x = r - 1; - err = dx - (int32_t)(r << 1); + x = r - 1; + err = dx - (int32_t)(r << 1); - SDL_LockSurface(_global.overlay); + SDL_LockSurface(_global.overlay); - while (x >= y) { - putPixel(x0 + x, y0 + y, &_global.colorForeground); - putPixel(x0 + y, y0 + x, &_global.colorForeground); - putPixel(x0 - y, y0 + x, &_global.colorForeground); - putPixel(x0 - x, y0 + y, &_global.colorForeground); - putPixel(x0 - x, y0 - y, &_global.colorForeground); - putPixel(x0 - y, y0 - x, &_global.colorForeground); - putPixel(x0 + y, y0 - x, &_global.colorForeground); - putPixel(x0 + x, y0 - y, &_global.colorForeground); + while (x >= y) { + putPixel(x0 + x, y0 + y, &_global.colorForeground); + putPixel(x0 + y, y0 + x, &_global.colorForeground); + putPixel(x0 - y, y0 + x, &_global.colorForeground); + putPixel(x0 - x, y0 + y, &_global.colorForeground); + putPixel(x0 - x, y0 - y, &_global.colorForeground); + putPixel(x0 - y, y0 - x, &_global.colorForeground); + putPixel(x0 + y, y0 - x, &_global.colorForeground); + putPixel(x0 + x, y0 - y, &_global.colorForeground); - if (err <= 0) { - y++; - err += dy; - dy += 2; - } + if (err <= 0) { + y++; + err += dy; + dy += 2; + } - if (err > 0) { - x--; - dx += 2; - err += dx - (r << 1); - } - } + if (err > 0) { + x--; + dx += 2; + err += dx - (r << 1); + } + } - SDL_UnlockSurface(_global.overlay); - result = true; + SDL_UnlockSurface(_global.overlay); + result = true; - } - } - } - } + } + } + } + } - if (result) { - luaTrace(L, "overlayCircle", "%d %d %d", xo, yo, ro); - } else { - luaDie(L, "overlayCircle", "Failed!"); - } + if (result) { + luaTrace(L, "overlayCircle", "%d %d %d", xo, yo, ro); + } else { + luaDie(L, "overlayCircle", "Failed!"); + } - return 0; + return 0; } int32_t apiOverlayClear(lua_State *L) { - (void)L; - SDL_FillRect(_global.overlay, NULL, SDL_MapRGBA(_global.overlay->format, _global.colorBackground.r, _global.colorBackground.g, _global.colorBackground.b, _global.colorBackground.a)); - luaTrace(L, "overlayClear", ""); - return 0; + (void)L; + SDL_FillRect(_global.overlay, NULL, SDL_MapRGBA(_global.overlay->format, _global.colorBackground.r, _global.colorBackground.g, _global.colorBackground.b, _global.colorBackground.a)); + luaTrace(L, "overlayClear", ""); + return 0; } int32_t apiOverlayEllipse(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t x0 = 0; - int32_t y0 = 0; - int32_t x1 = 0; - int32_t y1 = 0; - int32_t x0o = 0; - int32_t y0o = 0; - int32_t x1o = 0; - int32_t y1o = 0; - int32_t a = 0; - int32_t b = 0; - int32_t b1 = 0; - int32_t dx = 0; - int32_t dy = 0; - int32_t err = 0; - int32_t e2 = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t x0 = 0; + int32_t y0 = 0; + int32_t x1 = 0; + int32_t y1 = 0; + int32_t x0o = 0; + int32_t y0o = 0; + int32_t x1o = 0; + int32_t y1o = 0; + int32_t a = 0; + int32_t b = 0; + int32_t b1 = 0; + int32_t dx = 0; + int32_t dy = 0; + int32_t err = 0; + int32_t e2 = 0; + double d = 0; + bool result = false; - if (n == 4) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - if (lua_isnumber(L, 4)) { - d = lua_tonumber(L, 1); x0o = x0 = (int32_t)d; - d = lua_tonumber(L, 2); y0o = y0 = (int32_t)d; - d = lua_tonumber(L, 3); x1o = x1 = (int32_t)d; - d = lua_tonumber(L, 4); y1o = y1 = (int32_t)d; + if (n == 4) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + if (lua_isnumber(L, 4)) { + d = lua_tonumber(L, 1); x0o = x0 = (int32_t)d; + d = lua_tonumber(L, 2); y0o = y0 = (int32_t)d; + d = lua_tonumber(L, 3); x1o = x1 = (int32_t)d; + d = lua_tonumber(L, 4); y1o = y1 = (int32_t)d; - SDL_LockSurface(_global.overlay); + SDL_LockSurface(_global.overlay); - a = abs(x1 - x0); - b = abs(y1 - y0); - b1 = b & 1; // values of diameter - dx = 4 * (1 - a) * b * b; - dy = 4 * (b1 + 1) * a * a; // error increment - err = dx + dy + b1 * a * a; + a = abs(x1 - x0); + b = abs(y1 - y0); + b1 = b & 1; // values of diameter + dx = 4 * (1 - a) * b * b; + dy = 4 * (b1 + 1) * a * a; // error increment + err = dx + dy + b1 * a * a; - if (x0 > x1) { // if called with swapped points - x0 = x1; - x1 += a; - } + if (x0 > x1) { // if called with swapped points + x0 = x1; + x1 += a; + } - if (y0 > y1) { //exchange them - y0 = y1; - } + if (y0 > y1) { //exchange them + y0 = y1; + } - y0 += (b + 1) / 2; // starting pixel - y1 = y0 - b1; - a *= 8 * a; - b1 = 8 * b * b; + y0 += (b + 1) / 2; // starting pixel + y1 = y0 - b1; + a *= 8 * a; + b1 = 8 * b * b; - do { - putPixel(x1, y0, &_global.colorForeground); // I. Quadrant - putPixel(x0, y0, &_global.colorForeground); // II. Quadrant - putPixel(x0, y1, &_global.colorForeground); // III. Quadrant - putPixel(x1, y1, &_global.colorForeground); // IV. Quadrant - e2 = 2 * err; - if (e2 <= dy) { // y step - y0++; - y1--; - err += dy += a; - } - if (e2 >= dx || 2*err > dy) { // x step - x0++; - x1--; - err += dx += b1; - } - } while (x0 <= x1); + do { + putPixel(x1, y0, &_global.colorForeground); // I. Quadrant + putPixel(x0, y0, &_global.colorForeground); // II. Quadrant + putPixel(x0, y1, &_global.colorForeground); // III. Quadrant + putPixel(x1, y1, &_global.colorForeground); // IV. Quadrant + e2 = 2 * err; + if (e2 <= dy) { // y step + y0++; + y1--; + err += dy += a; + } + if (e2 >= dx || 2*err > dy) { // x step + x0++; + x1--; + err += dx += b1; + } + } while (x0 <= x1); - while (y0-y1 < b) { // too early stop of flat ellipses a = 1 - putPixel(x0-1, y0, &_global.colorForeground); // -> finish tip of ellipse - putPixel(x1+1, y0++, &_global.colorForeground); - putPixel(x0-1, y1, &_global.colorForeground); - putPixel(x1+1, y1--, &_global.colorForeground); - } + while (y0-y1 < b) { // too early stop of flat ellipses a = 1 + putPixel(x0-1, y0, &_global.colorForeground); // -> finish tip of ellipse + putPixel(x1+1, y0++, &_global.colorForeground); + putPixel(x0-1, y1, &_global.colorForeground); + putPixel(x1+1, y1--, &_global.colorForeground); + } - SDL_UnlockSurface(_global.overlay); - result = true; - } - } - } - } - } + SDL_UnlockSurface(_global.overlay); + result = true; + } + } + } + } + } - if (result) { - luaTrace(L, "overlayEllipse", "%d %d %d %d", x0o, y0o, x1o, y1o); - } else { - luaDie(L, "overlayEllipse", "Failed!"); - } + if (result) { + luaTrace(L, "overlayEllipse", "%d %d %d %d", x0o, y0o, x1o, y1o); + } else { + luaDie(L, "overlayEllipse", "Failed!"); + } - return 0; + return 0; } int32_t apiOverlayGetHeight(lua_State *L) { - luaTrace(L, "overlayGetHeight", "%d", _global.overlay->h); - lua_pushinteger(L, _global.overlay->h); - return 1; + luaTrace(L, "overlayGetHeight", "%d", _global.overlay->h); + lua_pushinteger(L, _global.overlay->h); + return 1; } int32_t apiOverlayGetWidth(lua_State *L) { - luaTrace(L, "overlayGetWidth", "%d", _global.overlay->w); - lua_pushinteger(L, _global.overlay->w); - return 1; + luaTrace(L, "overlayGetWidth", "%d", _global.overlay->w); + lua_pushinteger(L, _global.overlay->w); + return 1; } int32_t apiOverlayLine(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t x1 = 0; - int32_t y1 = 0; - int32_t x2 = 0; - int32_t y2 = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t x1 = 0; + int32_t y1 = 0; + int32_t x2 = 0; + int32_t y2 = 0; + double d = 0; + bool result = false; - if (n == 4) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - if (lua_isnumber(L, 4)) { - d = lua_tonumber(L, 1); x1 = (int32_t)d; - d = lua_tonumber(L, 2); y1 = (int32_t)d; - d = lua_tonumber(L, 3); x2 = (int32_t)d; - d = lua_tonumber(L, 4); y2 = (int32_t)d; + if (n == 4) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + if (lua_isnumber(L, 4)) { + d = lua_tonumber(L, 1); x1 = (int32_t)d; + d = lua_tonumber(L, 2); y1 = (int32_t)d; + d = lua_tonumber(L, 3); x2 = (int32_t)d; + d = lua_tonumber(L, 4); y2 = (int32_t)d; - SDL_LockSurface(_global.overlay); - line(x1, y1, x2, y2, &_global.colorForeground); - SDL_UnlockSurface(_global.overlay); - result = true; - } - } - } - } - } + SDL_LockSurface(_global.overlay); + line(x1, y1, x2, y2, &_global.colorForeground); + SDL_UnlockSurface(_global.overlay); + result = true; + } + } + } + } + } - if (result) { - luaTrace(L, "overlayLine", "%d %d %d %d", x1, y1, x2, y2); - } else { - luaDie(L, "overlayLine", "Failed!"); - } + if (result) { + luaTrace(L, "overlayLine", "%d %d %d %d", x1, y1, x2, y2); + } else { + luaDie(L, "overlayLine", "Failed!"); + } - return 0; + return 0; } int32_t apiOverlayPlot(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t x1 = 0; - int32_t y1 = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t x1 = 0; + int32_t y1 = 0; + double d = 0; + bool result = false; - if (n == 2) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - d = lua_tonumber(L, 1); x1 = (int32_t)d; - d = lua_tonumber(L, 2); y1 = (int32_t)d; + if (n == 2) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + d = lua_tonumber(L, 1); x1 = (int32_t)d; + d = lua_tonumber(L, 2); y1 = (int32_t)d; - SDL_LockSurface(_global.overlay); - putPixel(x1, y1, &_global.colorForeground); - SDL_UnlockSurface(_global.overlay); - result = true; - } - } - } + SDL_LockSurface(_global.overlay); + putPixel(x1, y1, &_global.colorForeground); + SDL_UnlockSurface(_global.overlay); + result = true; + } + } + } - if (result) { - luaTrace(L, "overlayPlot", "%d %d", x1, y1); - } else { - luaDie(L, "overlayPlot", "Failed!"); - } + if (result) { + luaTrace(L, "overlayPlot", "%d %d", x1, y1); + } else { + luaDie(L, "overlayPlot", "Failed!"); + } - return 0; + return 0; } int32_t apiOverlayPrint(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t i = 0; - char *s = NULL; - int32_t length = 0; - bool result = false; - SDL_Rect src; - SDL_Rect dst; + int32_t n = lua_gettop(L); + int32_t i = 0; + char *s = NULL; + int32_t length = 0; + bool result = false; + SDL_Rect src; + SDL_Rect dst; - if (n == 3) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isstring(L, 3)) { - src.y = 0; - src.w = _global.consoleFontWidth; - src.h = _global.consoleFontHeight; - dst.x = lua_tonumber(L, 1) * _global.consoleFontWidth; - dst.y = lua_tonumber(L, 2) * _global.consoleFontHeight; - dst.w = _global.consoleFontWidth; - dst.h = _global.consoleFontHeight; - s = (char *)lua_tostring(L, 3); - if (strlen(s) < (uint32_t)((_global.overlay->w - dst.x) / _global.consoleFontWidth)) { - length = strlen(s); - } else { - length = (_global.overlay->w - dst.x) / _global.consoleFontWidth; - } - for (i=0; iw - dst.x) / _global.consoleFontWidth)) { + length = strlen(s); + } else { + length = (_global.overlay->w - dst.x) / _global.consoleFontWidth; + } + for (i=0; ichunk = Mix_LoadWAV(name); - if (!sound->chunk) luaDie(L, "soundLoad", "%s", Mix_GetError()); - sound->id = _global.nextSoundId; - result = _global.nextSoundId++; - HASH_ADD_INT(_global.soundList, id, sound); - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + sound = (SoundT *)calloc(1, sizeof(SoundT)); + if (!sound) luaDie(L, "soundLoad", "Unable to allocate new sound."); + name = lua_tostring(L, 1); + sound->chunk = Mix_LoadWAV(name); + if (!sound->chunk) luaDie(L, "soundLoad", "%s", Mix_GetError()); + sound->id = _global.nextSoundId; + result = _global.nextSoundId++; + HASH_ADD_INT(_global.soundList, id, sound); + } + } - if (sound) { - luaTrace(L, "soundLoad", "%d %s", result, name); - } else { - luaDie(L, "soundLoad", "Failed!"); - } + if (sound) { + luaTrace(L, "soundLoad", "%d %s", result, name); + } else { + luaDie(L, "soundLoad", "Failed!"); + } - lua_pushnumber(L, result); - return 1; + lua_pushnumber(L, result); + return 1; } int32_t apiSoundPlay(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t r = -1; - int32_t id = -1; - double d = 0; - bool result = false; - SoundT *sound = NULL; + int32_t n = lua_gettop(L); + int32_t r = -1; + int32_t id = -1; + double d = 0; + bool result = false; + SoundT *sound = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our sound structure - HASH_FIND_INT(_global.soundList, &id, sound); - if (!sound) luaDie(L, "soundPlay", "No sound at index %d in apiSoundPlay.", id); - // Play it (can gracefully fail if we run out of channels) - r = Mix_PlayChannel(-1, sound->chunk, 0); - if (r >= 0) { - Mix_Volume(r, _global.effectsVolume * 2); - } - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our sound structure + HASH_FIND_INT(_global.soundList, &id, sound); + if (!sound) luaDie(L, "soundPlay", "No sound at index %d in apiSoundPlay.", id); + // Play it (can gracefully fail if we run out of channels) + r = Mix_PlayChannel(-1, sound->chunk, 0); + if (r >= 0) { + Mix_Volume(r, _global.effectsVolume * 2); + } + result = true; + } + } - if (result) { - luaTrace(L, "soundPlay", "%d", r); - } else { - luaDie(L, "soundPlay", "Failed!"); - } + if (result) { + luaTrace(L, "soundPlay", "%d", r); + } else { + luaDie(L, "soundPlay", "Failed!"); + } - lua_pushnumber(L, r); - return 1; + lua_pushnumber(L, r); + return 1; } int32_t apiSoundPause(lua_State *L) { - // Instructs Daphne to pause a given sample from playing. - // User must feed the sound handle on the lua side. - // e.g. lua code, - // - // thisHandle = soundPlay(mySound) - // soundPause(thisHandle) - // - // Function returns true if sample was paused, false otherwise. - // - // --rdg + // Instructs Daphne to pause a given sample from playing. + // User must feed the sound handle on the lua side. + // e.g. lua code, + // + // thisHandle = soundPlay(mySound) + // soundPause(thisHandle) + // + // Function returns true if sample was paused, false otherwise. + // + // --rdg - int32_t n = lua_gettop(L); - int32_t channel = -1; - double d = 0; - bool r = false; - bool result = false; + int32_t n = lua_gettop(L); + int32_t channel = -1; + double d = 0; + bool r = false; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); channel = (int32_t)d; - r = Mix_Playing(channel); - Mix_Pause(channel); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); channel = (int32_t)d; + r = Mix_Playing(channel); + Mix_Pause(channel); + result = true; + } + } - if (result) { - luaTrace(L, "soundPause", "%d %d", channel, r); - } else { - luaDie(L, "soundPause", "Failed!"); - } + if (result) { + luaTrace(L, "soundPause", "%d %d", channel, r); + } else { + luaDie(L, "soundPause", "Failed!"); + } - lua_pushboolean(L, r); - return 1; + lua_pushboolean(L, r); + return 1; } int32_t apiSoundResume(lua_State *L) { - // Instructs Daphne to unpause a sound that was previously paused. - // User must feed the sound handle on the lua side. - // e.g. lua code, - // - // thisHandle = soundPlay(mySound) - // soundPause(thisHandle) - // soundResume(thisHandle) - // - // Function returns true if sample was unpaused, false otherwise. - // - // --rdg + // Instructs Daphne to unpause a sound that was previously paused. + // User must feed the sound handle on the lua side. + // e.g. lua code, + // + // thisHandle = soundPlay(mySound) + // soundPause(thisHandle) + // soundResume(thisHandle) + // + // Function returns true if sample was unpaused, false otherwise. + // + // --rdg - int32_t n = lua_gettop(L); - int32_t channel = -1; - double d = 0; - bool r = false; - bool result = false; + int32_t n = lua_gettop(L); + int32_t channel = -1; + double d = 0; + bool r = false; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); channel = (int32_t)d; - r = Mix_Paused(channel); - Mix_Resume(channel); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); channel = (int32_t)d; + r = Mix_Paused(channel); + Mix_Resume(channel); + result = true; + } + } - if (result) { - luaTrace(L, "soundResume", "%d %d", channel, r); - } else { - luaDie(L, "soundResume", "Failed!"); - } + if (result) { + luaTrace(L, "soundResume", "%d %d", channel, r); + } else { + luaDie(L, "soundResume", "Failed!"); + } - lua_pushboolean(L, r); - return 1; + lua_pushboolean(L, r); + return 1; } int32_t apiSoundIsPlaying(lua_State *L) { - // Checks to see if a certain sound has finished playing. - // User must feed the sound handle on the lua side. - // e.g. lua code, - // - // thisHandle = soundPlay(mySound) - // if (soundIsPlaying(thisSound)) then do something ... end - // - // Function returns true if sample is still playing, false otherwise. - // - // --rdg + // Checks to see if a certain sound has finished playing. + // User must feed the sound handle on the lua side. + // e.g. lua code, + // + // thisHandle = soundPlay(mySound) + // if (soundIsPlaying(thisSound)) then do something ... end + // + // Function returns true if sample is still playing, false otherwise. + // + // --rdg - int32_t n = lua_gettop(L); - int32_t channel = -1; - double d = 0; - bool r = false; - bool result = false; + int32_t n = lua_gettop(L); + int32_t channel = -1; + double d = 0; + bool r = false; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); channel = (int32_t)d; - r = (bool)Mix_Playing(channel); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); channel = (int32_t)d; + r = (bool)Mix_Playing(channel); + result = true; + } + } - if (result) { - luaTrace(L, "soundIsPlaying", "%d %d", channel, r); - } else { - luaDie(L, "soundIsPlaying", "Failed!"); - } + if (result) { + luaTrace(L, "soundIsPlaying", "%d %d", channel, r); + } else { + luaDie(L, "soundIsPlaying", "Failed!"); + } - lua_pushboolean(L, r); - return 1; + lua_pushboolean(L, r); + return 1; } int32_t apiSoundStop(lua_State *L) { - // Instructs Daphne to end a sound early. - // User must feed the sound handle on the lua side. - // e.g. lua code, - // - // thisHandle = soundPlay(mySound) - // soundStop(thisHandle) - // - // Function returns true if sample was stopped, false otherwise. - // NOTE: thisHandle will be invalidated as a result of this function. - // Lua doesn't do variables by reference, so it is - // up to the user to keep track of sound handles on the lua script. - // - // --rdg + // Instructs Daphne to end a sound early. + // User must feed the sound handle on the lua side. + // e.g. lua code, + // + // thisHandle = soundPlay(mySound) + // soundStop(thisHandle) + // + // Function returns true if sample was stopped, false otherwise. + // NOTE: thisHandle will be invalidated as a result of this function. + // Lua doesn't do variables by reference, so it is + // up to the user to keep track of sound handles on the lua script. + // + // --rdg - int32_t n = lua_gettop(L); - int32_t channel = -1; - double d = 0; - bool r = false; - bool result = false; + int32_t n = lua_gettop(L); + int32_t channel = -1; + double d = 0; + bool r = false; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); channel = (int32_t)d; - r = Mix_Playing(channel); - Mix_HaltChannel(channel); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); channel = (int32_t)d; + r = Mix_Playing(channel); + Mix_HaltChannel(channel); + result = true; + } + } - if (result) { - luaTrace(L, "soundStop", "%d %d", channel, r); - } else { - luaDie(L, "soundStop", "Failed!"); - } + if (result) { + luaTrace(L, "soundStop", "%d %d", channel, r); + } else { + luaDie(L, "soundStop", "Failed!"); + } - lua_pushboolean(L, r); - return 1; + lua_pushboolean(L, r); + return 1; } int32_t apiSoundSetVolume(lua_State *L) { - // Allows manipulation of sample volume. - // Valid values range from 0 to 63 - // e.g. lua code, - // - // soundSetVolume(32) - // - // Function returns nothing. - // - // --rdg + // Allows manipulation of sample volume. + // Valid values range from 0 to 63 + // e.g. lua code, + // + // soundSetVolume(32) + // + // Function returns nothing. + // + // --rdg - int32_t n = lua_gettop(L); - int32_t thisValue = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t thisValue = 0; + double d = 0; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); thisValue = (int32_t)d; - if (thisValue >= 0 && thisValue <= AUDIO_MAX_VOLUME) { - _global.effectsVolume = thisValue; - Mix_Volume(-1, _global.effectsVolume * 2); - } else { - luaDie(L, "soundSetVolume", "Invalid sound volume value."); - } - } - result = true; - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); thisValue = (int32_t)d; + if (thisValue >= 0 && thisValue <= AUDIO_MAX_VOLUME) { + _global.effectsVolume = thisValue; + Mix_Volume(-1, _global.effectsVolume * 2); + } else { + luaDie(L, "soundSetVolume", "Invalid sound volume value."); + } + } + result = true; + } - if (result) { - luaTrace(L, "soundSetVolume", "%d", _global.effectsVolume); - } else { - luaDie(L, "soundSetVolume", "Failed!"); - } + if (result) { + luaTrace(L, "soundSetVolume", "%d", _global.effectsVolume); + } else { + luaDie(L, "soundSetVolume", "Failed!"); + } - return 0; + return 0; } int32_t apiSoundGetVolume(lua_State *L) { - // Returns the current sample volume value. - // e.g. lua code, - // - // local iVolume = soundGetVolume() - // - // Function returns an integer value ranging from 0 to 63. - // - // --rdg + // Returns the current sample volume value. + // e.g. lua code, + // + // local iVolume = soundGetVolume() + // + // Function returns an integer value ranging from 0 to 63. + // + // --rdg - luaTrace(L, "soundGetVolume", "%d", _global.effectsVolume); + luaTrace(L, "soundGetVolume", "%d", _global.effectsVolume); - lua_pushinteger(L, _global.effectsVolume); - return 1; + lua_pushinteger(L, _global.effectsVolume); + return 1; } int32_t apiSoundFullStop(lua_State *L) { - // Clears the audio queue of any samples actively playing. - // No parameters needed. Function returns nothing. - // e.g. lua code, - // - // soundFullStop() + // Clears the audio queue of any samples actively playing. + // No parameters needed. Function returns nothing. + // e.g. lua code, + // + // soundFullStop() - (void)L; + (void)L; - luaTrace(L, "soundFullStop", ""); + luaTrace(L, "soundFullStop", ""); - Mix_HaltChannel(-1); - return 0; + Mix_HaltChannel(-1); + return 0; } int32_t apiSoundUnload(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - double d; - SoundT *sound = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + double d; + SoundT *sound = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our sound structure - HASH_FIND_INT(_global.soundList, &id, sound); - if (!sound) luaDie(L, "soundUnload", "No sound at index %d in apiSoundUnload.", id); - HASH_DEL(_global.soundList, sound); - Mix_FreeChunk(sound->chunk); - free(sound); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our sound structure + HASH_FIND_INT(_global.soundList, &id, sound); + if (!sound) luaDie(L, "soundUnload", "No sound at index %d in apiSoundUnload.", id); + HASH_DEL(_global.soundList, sound); + Mix_FreeChunk(sound->chunk); + free(sound); + result = true; + } + } - if (result) { - luaTrace(L, "soundUnload", "%d", id); - } else { - luaDie(L, "soundUnload", "Failed!"); - } + if (result) { + luaTrace(L, "soundUnload", "%d", id); + } else { + luaDie(L, "soundUnload", "Failed!"); + } - return 0; + return 0; } int32_t apiSpriteDraw(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t id = -1; - double d = 0; - SpriteT *sprite = NULL; - SDL_Rect dest; + int32_t n = lua_gettop(L); + int32_t id = -1; + double d = 0; + SpriteT *sprite = NULL; + SDL_Rect dest; - if ((n == 3) || (n == 5)) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - d = lua_tonumber(L, 1); dest.x = (int32_t)d; - d = lua_tonumber(L, 2); dest.y = (int32_t)d; - if (n == 5) { - // Target is scaled - if (lua_isnumber(L, 4)) { - if (lua_isnumber(L, 5)) { - d = lua_tonumber(L, 3); dest.w = (int32_t)d - dest.x + 1; - d = lua_tonumber(L, 4); dest.h = (int32_t)d - dest.y + 1; - d = lua_tonumber(L, 5); id = (int32_t)d; - } - } - } else { - // Target is same size as sprite - d = lua_tonumber(L, 3); id = (int32_t)d; - } - HASH_FIND_INT(_global.spriteList, &id, sprite); - if (!sprite) luaDie(L, "spriteDraw", "No sprite at index %d in apiSpriteDraw.", id); - if (n == 5) { - // Target is scaled - SDL_BlitScaled(sprite->surface, NULL, _global.overlay, &dest); - } else { - // Target is same size as sprite - dest.w = sprite->surface->w; - dest.h = sprite->surface->h; - SDL_BlitSurface(sprite->surface, NULL, _global.overlay, &dest); - } - } - } - } - } + if ((n == 3) || (n == 5)) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + d = lua_tonumber(L, 1); dest.x = (int32_t)d; + d = lua_tonumber(L, 2); dest.y = (int32_t)d; + if (n == 5) { + // Target is scaled + if (lua_isnumber(L, 4)) { + if (lua_isnumber(L, 5)) { + d = lua_tonumber(L, 3); dest.w = (int32_t)d - dest.x + 1; + d = lua_tonumber(L, 4); dest.h = (int32_t)d - dest.y + 1; + d = lua_tonumber(L, 5); id = (int32_t)d; + } + } + } else { + // Target is same size as sprite + d = lua_tonumber(L, 3); id = (int32_t)d; + } + HASH_FIND_INT(_global.spriteList, &id, sprite); + if (!sprite) luaDie(L, "spriteDraw", "No sprite at index %d in apiSpriteDraw.", id); + if (n == 5) { + // Target is scaled + SDL_BlitScaled(sprite->surface, NULL, _global.overlay, &dest); + } else { + // Target is same size as sprite + dest.w = sprite->surface->w; + dest.h = sprite->surface->h; + SDL_BlitSurface(sprite->surface, NULL, _global.overlay, &dest); + } + } + } + } + } - if (id >= 0) { - luaTrace(L, "spriteDraw", "%d %d %d %d %d", id, dest.x, dest.y, dest.w, dest.h); - } else { - luaDie(L, "spriteDraw", "Failed!"); - } + if (id >= 0) { + luaTrace(L, "spriteDraw", "%d %d %d %d %d", id, dest.x, dest.y, dest.w, dest.h); + } else { + luaDie(L, "spriteDraw", "Failed!"); + } - return 0; + return 0; } int32_t apiSpriteGetHeight(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t result = -1; - int32_t id = -1; - double d; - SpriteT *sprite = NULL; + int32_t n = lua_gettop(L); + int32_t result = -1; + int32_t id = -1; + double d; + SpriteT *sprite = NULL; - if (n == 1) { - if (lua_isstring(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our sprite structure - HASH_FIND_INT(_global.spriteList, &id, sprite); - if (!sprite) luaDie(L, "spriteGetHeight", "No sprite at index %d in apiSpriteGetHeight.", id); - result = sprite->surface->h; - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our sprite structure + HASH_FIND_INT(_global.spriteList, &id, sprite); + if (!sprite) luaDie(L, "spriteGetHeight", "No sprite at index %d in apiSpriteGetHeight.", id); + result = sprite->surface->h; + } + } - if (result >= 0) { - luaTrace(L, "spriteGetHeight", "%d", result); - } else { - luaDie(L, "spriteGetHeight", "Failed!"); - } + if (result >= 0) { + luaTrace(L, "spriteGetHeight", "%d", result); + } else { + luaDie(L, "spriteGetHeight", "Failed!"); + } - lua_pushinteger(L, result); - return 1; + lua_pushinteger(L, result); + return 1; } int32_t apiSpriteGetWidth(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t result = -1; - int32_t id = -1; - double d; - SpriteT *sprite = NULL; + int32_t n = lua_gettop(L); + int32_t result = -1; + int32_t id = -1; + double d; + SpriteT *sprite = NULL; - if (n == 1) { - if (lua_isstring(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our sprite structure - HASH_FIND_INT(_global.spriteList, &id, sprite); - if (!sprite) luaDie(L, "spriteGetWidth", "No sprite at index %d in apiSpriteGetWidth.", id); - result = sprite->surface->w; - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our sprite structure + HASH_FIND_INT(_global.spriteList, &id, sprite); + if (!sprite) luaDie(L, "spriteGetWidth", "No sprite at index %d in apiSpriteGetWidth.", id); + result = sprite->surface->w; + } + } - if (result >= 0) { - luaTrace(L, "spriteGetWidth", "%d", result); - } else { - luaDie(L, "spriteGetWidth", "Failed!"); - } + if (result >= 0) { + luaTrace(L, "spriteGetWidth", "%d", result); + } else { + luaDie(L, "spriteGetWidth", "Failed!"); + } - lua_pushinteger(L, result); - return 1; + lua_pushinteger(L, result); + return 1; } int32_t apiSpriteLoad(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t result = -1; - const char *name = NULL; - SpriteT *sprite = NULL; + int32_t n = lua_gettop(L); + int32_t result = -1; + const char *name = NULL; + SpriteT *sprite = NULL; - if (n == 1) { - if (lua_isstring(L, 1)) { - sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); - if (!sprite) luaDie(L, "spriteLoad", "Unable to allocate new sprite."); - name = lua_tostring(L, 1); - sprite->surface = IMG_Load(name); - if (!sprite->surface) luaDie(L, "spriteLoad", "%s", IMG_GetError()); - SDL_SetColorKey(sprite->surface, true, 0); - sprite->id = _global.nextSpriteId; - result = _global.nextSpriteId++; - HASH_ADD_INT(_global.spriteList, id, sprite); - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); + if (!sprite) luaDie(L, "spriteLoad", "Unable to allocate new sprite."); + name = lua_tostring(L, 1); + sprite->surface = IMG_Load(name); + if (!sprite->surface) luaDie(L, "spriteLoad", "%s", IMG_GetError()); + SDL_SetColorKey(sprite->surface, true, 0); + sprite->id = _global.nextSpriteId; + result = _global.nextSpriteId++; + HASH_ADD_INT(_global.spriteList, id, sprite); + } + } - if (sprite->surface) { - luaTrace(L, "spriteLoad", "%d %s", result, name); - } else { - luaDie(L, "spriteLoad", "Failed!"); - } + if (sprite->surface) { + luaTrace(L, "spriteLoad", "%d %s", result, name); + } else { + luaDie(L, "spriteLoad", "Failed!"); + } - lua_pushnumber(L, result); - return 1; + lua_pushnumber(L, result); + return 1; } int32_t apiSpriteUnload(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - double d; - SpriteT *sprite = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + double d; + SpriteT *sprite = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our sprite structure - HASH_FIND_INT(_global.spriteList, &id, sprite); - if (!sprite) luaDie(L, "spriteUnload", "No sprite at index %d in apiSpriteUnload.", id); - HASH_DEL(_global.spriteList, sprite); - SDL_FreeSurface(sprite->surface); - free(sprite); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our sprite structure + HASH_FIND_INT(_global.spriteList, &id, sprite); + if (!sprite) luaDie(L, "spriteUnload", "No sprite at index %d in apiSpriteUnload.", id); + HASH_DEL(_global.spriteList, sprite); + SDL_FreeSurface(sprite->surface); + free(sprite); + result = true; + } + } - if (result) { - luaTrace(L, "spriteUnload", "%d", id); - } else { - luaDie(L, "spriteUnload", "Failed!"); - } + if (result) { + luaTrace(L, "spriteUnload", "%d", id); + } else { + luaDie(L, "spriteUnload", "Failed!"); + } - return 0; + return 0; } int32_t apiVideoDraw(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - int32_t w = 0; - int32_t h = 0; - int64_t frame = 0; - double d = 0.0; - VideoT *video = NULL; - SDL_Rect dest; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + int32_t w = 0; + int32_t h = 0; + int64_t frame = 0; + double d = 0.0; + VideoT *video = NULL; + SDL_Rect dest; - if (n == 5) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - if (lua_isnumber(L, 4)) { - if (lua_isnumber(L, 5)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - d = lua_tonumber(L, 2); dest.x = (int32_t)d; - d = lua_tonumber(L, 3); dest.y = (int32_t)d; - d = lua_tonumber(L, 4); dest.w = (int32_t)d - dest.x + 1; - d = lua_tonumber(L, 5); dest.h = (int32_t)d - dest.y + 1; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoDraw", "No video at index %d in apiVideoDraw.", id); - frame = videoUpdate(video->handle, &video->texture); - // New Frame? - if (frame != video->lastFrame) { - // Get new frame into a surface - this is slow - if (video->surface) SDL_FreeSurface(video->surface); - SDL_QueryTexture(video->texture, NULL, NULL, &w, &h); - video->surface = SDL_CreateRGBSurface(0, w, h, 32, 0, 0, 0, 255); - if (!video->surface) utilDie("%s", SDL_GetError()); - if (SDL_SetRenderTarget(_global.renderer, video->texture) < 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); - if (SDL_RenderReadPixels(_global.renderer, NULL, video->surface->format->format, video->surface->pixels, video->surface->pitch) != 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); - if (SDL_SetRenderTarget(_global.renderer, NULL) < 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); - } - // Render frame into overlay - if (SDL_BlitScaled(video->surface, NULL, _global.overlay, &dest) != 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); - result = true; - } - } - } - } - } - } + if (n == 5) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + if (lua_isnumber(L, 4)) { + if (lua_isnumber(L, 5)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + d = lua_tonumber(L, 2); dest.x = (int32_t)d; + d = lua_tonumber(L, 3); dest.y = (int32_t)d; + d = lua_tonumber(L, 4); dest.w = (int32_t)d - dest.x + 1; + d = lua_tonumber(L, 5); dest.h = (int32_t)d - dest.y + 1; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoDraw", "No video at index %d in apiVideoDraw.", id); + frame = videoUpdate(video->handle, &video->texture); + // New Frame? + if (frame != video->lastFrame) { + // Get new frame into a surface - this is slow + if (video->surface) SDL_FreeSurface(video->surface); + SDL_QueryTexture(video->texture, NULL, NULL, &w, &h); + video->surface = SDL_CreateRGBSurface(0, w, h, 32, 0, 0, 0, 255); + if (!video->surface) utilDie("%s", SDL_GetError()); + if (SDL_SetRenderTarget(_global.renderer, video->texture) < 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); + if (SDL_RenderReadPixels(_global.renderer, NULL, video->surface->format->format, video->surface->pixels, video->surface->pitch) != 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); + if (SDL_SetRenderTarget(_global.renderer, NULL) < 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); + } + // Render frame into overlay + if (SDL_BlitScaled(video->surface, NULL, _global.overlay, &dest) != 0) luaDie(L, "videoDraw", "%s", SDL_GetError()); + result = true; + } + } + } + } + } + } - if (result) { - luaTrace(L, "videoDraw", "%d %d %d %d %d %ld", id, dest.x, dest.y, dest.x + dest.w, dest.y + dest.h, frame); - } else { - luaDie(L, "videoDraw", "Failed!"); - } + if (result) { + luaTrace(L, "videoDraw", "%d %d %d %d %d %ld", id, dest.x, dest.y, dest.x + dest.w, dest.y + dest.h, frame); + } else { + luaDie(L, "videoDraw", "Failed!"); + } - return 0; + return 0; } int32_t apiVideoGetFrame(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int64_t r = 0; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int64_t r = 0; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoGetFrame", "No video at index %d in apiVideoGetFrame.", id); - r = videoGetFrame(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoGetFrame", "No video at index %d in apiVideoGetFrame.", id); + r = videoGetFrame(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoGetFrame", "%d %ld", id, r); - } else { - luaDie(L, "videoGetFrame", "Failed!"); - } + if (result) { + luaTrace(L, "videoGetFrame", "%d %ld", id, r); + } else { + luaDie(L, "videoGetFrame", "Failed!"); + } - lua_pushnumber(L, r); - return 1; + lua_pushnumber(L, r); + return 1; } int32_t apiVideoGetFrameCount(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int64_t r = 0; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int64_t r = 0; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoGetFrameCount", "No video at index %d in apiVideoGetFrameCount.", id); - r = videoGetFrameCount(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoGetFrameCount", "No video at index %d in apiVideoGetFrameCount.", id); + r = videoGetFrameCount(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoGetFrameCount", "%d %ld", id, r); - } else { - luaDie(L, "videoGetFrameCount", "Failed!"); - } + if (result) { + luaTrace(L, "videoGetFrameCount", "%d %ld", id, r); + } else { + luaDie(L, "videoGetFrameCount", "Failed!"); + } - lua_pushnumber(L, r); - return 1; + lua_pushnumber(L, r); + return 1; } int32_t apiVideoGetHeight(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t r = 0; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t r = 0; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoGetHeight", "No video at index %d in apiVideoGetHeight.", id); - r = videoGetHeight(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoGetHeight", "No video at index %d in apiVideoGetHeight.", id); + r = videoGetHeight(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoGetHeight", "%d %d", id, r); - } else { - luaDie(L, "videoGetHeight", "Failed!"); - } + if (result) { + luaTrace(L, "videoGetHeight", "%d %d", id, r); + } else { + luaDie(L, "videoGetHeight", "Failed!"); + } - lua_pushnumber(L, r); - return 1; + lua_pushnumber(L, r); + return 1; } int32_t apiVideoGetVolume(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t left = 0; - int32_t right = 0; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t left = 0; + int32_t right = 0; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoGetVolume", "No video at index %d in apiVideoGetVolume.", id); - videoGetVolume(video->handle, &left, &right); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoGetVolume", "No video at index %d in apiVideoGetVolume.", id); + videoGetVolume(video->handle, &left, &right); + result = true; + } + } - if (result) { - luaTrace(L, "videoGetVolume", "%d %d %d", id, left, right); - } else { - luaDie(L, "videoGetVolume", "Failed!"); - } + if (result) { + luaTrace(L, "videoGetVolume", "%d %d %d", id, left, right); + } else { + luaDie(L, "videoGetVolume", "Failed!"); + } - lua_pushnumber(L, left); - lua_pushnumber(L, right); - return 2; + lua_pushnumber(L, left); + lua_pushnumber(L, right); + return 2; } int32_t apiVideoGetWidth(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t r = 0; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t r = 0; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoGetWidth", "No video at index %d in apiVideoGetWidth.", id); - r = videoGetWidth(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoGetWidth", "No video at index %d in apiVideoGetWidth.", id); + r = videoGetWidth(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoGetWidth", "%d %d", id, r); - } else { - luaDie(L, "videoGetWidth", "Failed!"); - } + if (result) { + luaTrace(L, "videoGetWidth", "%d %d", id, r); + } else { + luaDie(L, "videoGetWidth", "Failed!"); + } - lua_pushnumber(L, r); - return 1; + lua_pushnumber(L, r); + return 1; } int32_t apiVideoIsPlaying(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t r = 0; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t r = 0; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoIsPlaying", "No video at index %d in apiVideoIsPlaying.", id); - r = videoIsPlaying(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoIsPlaying", "No video at index %d in apiVideoIsPlaying.", id); + r = videoIsPlaying(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoIsPlaying", "%d %d", id, r); - } else { - luaDie(L, "videoIsPlaying", "Failed!"); - } + if (result) { + luaTrace(L, "videoIsPlaying", "%d %d", id, r); + } else { + luaDie(L, "videoIsPlaying", "Failed!"); + } - lua_pushnumber(L, r); - return 1; + lua_pushnumber(L, r); + return 1; } int32_t apiVideoLoad(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t result = -1; - const char *name = NULL; - char *data = NULL; - char *temp = NULL; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + int32_t result = -1; + const char *name = NULL; + char *data = NULL; + char *temp = NULL; + VideoT *video = NULL; - if (n == 1) { - if (lua_isstring(L, 1)) { - name = lua_tostring(L, 1); - // Create data directory based on video path. - temp = utilGetUpToLastPathComponent((char *)name); - data = utilCreateString("%s%s", _global.conf->dataDirBase, temp); - free(temp); - temp = NULL; - utilFixPathSeparators(&data, false); - // Be sure it exists. - utilMkDirP(data, 0777); - if (!utilPathExists(data)) { - luaDie(L, "videoLoad", "Unable to create data directory: %s", data); - } - // Load this video. - video = (VideoT *)calloc(1, sizeof(VideoT)); - if (!video) luaDie(L, "videoLoad", "Unable to allocate new video."); - video->handle = videoLoad((char *)name, data, false, _global.renderer); - if (video->handle < 0) luaDie(L, "videoLoad", "Failed to load video: %s", name); - video->id = _global.nextVideoId; - video->lastFrame = -1; - result = _global.nextVideoId++; - HASH_ADD_INT(_global.videoList, id, video); - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + name = lua_tostring(L, 1); + // Create data directory based on video path. + temp = utilGetUpToLastPathComponent((char *)name); + data = utilCreateString("%s%s", _global.conf->dataDirBase, temp); + free(temp); + temp = NULL; + utilFixPathSeparators(&data, false); + // Be sure it exists. + utilMkDirP(data, 0777); + if (!utilPathExists(data)) { + luaDie(L, "videoLoad", "Unable to create data directory: %s", data); + } + // Load this video. + video = (VideoT *)calloc(1, sizeof(VideoT)); + if (!video) luaDie(L, "videoLoad", "Unable to allocate new video."); + video->handle = videoLoad((char *)name, data, false, _global.renderer); + if (video->handle < 0) luaDie(L, "videoLoad", "Failed to load video: %s", name); + video->id = _global.nextVideoId; + video->lastFrame = -1; + result = _global.nextVideoId++; + HASH_ADD_INT(_global.videoList, id, video); + } + } - if (result >= 0) { - luaTrace(L, "videoLoad", "%s %s %d", name, data, result); - } else { - luaDie(L, "videoLoad", "Failed!"); - } + if (result >= 0) { + luaTrace(L, "videoLoad", "%s %s %d", name, data, result); + } else { + luaDie(L, "videoLoad", "Failed!"); + } - free(data); + free(data); - lua_pushnumber(L, result); - return 1; + lua_pushnumber(L, result); + return 1; } int32_t apiVideoPause(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoPause", "No video at index %d in apiVideoPause.", id); - videoPause(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoPause", "No video at index %d in apiVideoPause.", id); + videoPause(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoPause", "%d", id); - } else { - luaDie(L, "videoPause", "Failed!"); - } + if (result) { + luaTrace(L, "videoPause", "%d", id); + } else { + luaDie(L, "videoPause", "Failed!"); + } - return 0; + return 0; } int32_t apiVideoPlay(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoPlay", "No video at index %d in apiVideoPlay.", id); - videoPlay(video->handle); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoPlay", "No video at index %d in apiVideoPlay.", id); + videoPlay(video->handle); + result = true; + } + } - if (result) { - luaTrace(L, "videoPlay", "%d", id); - } else { - luaDie(L, "videoPlay", "Failed!"); - } + if (result) { + luaTrace(L, "videoPlay", "%d", id); + } else { + luaDie(L, "videoPlay", "Failed!"); + } - return 0; + return 0; } int32_t apiVideoSeek(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - int64_t frame = 0; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + int64_t frame = 0; + double d; + VideoT *video = NULL; - if (n == 2) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - d = lua_tonumber(L, 2); frame = (int64_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoSeek", "No video at index %d in apiVideoSeek.", id); - videoSeek(video->handle, frame); - result = true; - } - } - } + if (n == 2) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + d = lua_tonumber(L, 2); frame = (int64_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoSeek", "No video at index %d in apiVideoSeek.", id); + videoSeek(video->handle, frame); + result = true; + } + } + } - if (result) { - luaTrace(L, "videoSeek", "%d %ld", id, frame); - } else { - luaDie(L, "videoSeek", "Failed!"); - } + if (result) { + luaTrace(L, "videoSeek", "%d %ld", id, frame); + } else { + luaDie(L, "videoSeek", "Failed!"); + } - return 0; + return 0; } int32_t apiVideoSetVolume(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - int32_t left = 0; - int32_t right = 0; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + int32_t left = 0; + int32_t right = 0; + double d; + VideoT *video = NULL; - if (n == 3) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - if (lua_isnumber(L, 3)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - d = lua_tonumber(L, 2); left = (int32_t)d; - d = lua_tonumber(L, 3); right = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoSetVolume", "No video at index %d in apiVideoSetVolume.", id); - if (left < 0) left = 0; - if (left > 100) left = 100; - if (right < 0) right = 0; - if (right > 100) right = 100; - videoSetVolume(video->handle, left, right); - result = true; - } - } - } - } + if (n == 3) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + if (lua_isnumber(L, 3)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + d = lua_tonumber(L, 2); left = (int32_t)d; + d = lua_tonumber(L, 3); right = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoSetVolume", "No video at index %d in apiVideoSetVolume.", id); + if (left < 0) left = 0; + if (left > 100) left = 100; + if (right < 0) right = 0; + if (right > 100) right = 100; + videoSetVolume(video->handle, left, right); + result = true; + } + } + } + } - if (result) { - luaTrace(L, "videoSetVolume", "%d", id, left, right); - } else { - luaDie(L, "videoSetVolume", "Failed!"); - } + if (result) { + luaTrace(L, "videoSetVolume", "%d", id, left, right); + } else { + luaDie(L, "videoSetVolume", "Failed!"); + } - return 0; + return 0; } int32_t apiVideoUnload(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; - int32_t id = -1; - double d; - VideoT *video = NULL; + int32_t n = lua_gettop(L); + bool result = false; + int32_t id = -1; + double d; + VideoT *video = NULL; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); id = (int32_t)d; - // Get our video structure - HASH_FIND_INT(_global.videoList, &id, video); - if (!video) luaDie(L, "videoUnload", "No video at index %d in apiVideoUnload.", id); - HASH_DEL(_global.videoList, video); - videoUnload(video->handle); - if (video->surface) SDL_FreeSurface(video->surface); - free(video); - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); id = (int32_t)d; + // Get our video structure + HASH_FIND_INT(_global.videoList, &id, video); + if (!video) luaDie(L, "videoUnload", "No video at index %d in apiVideoUnload.", id); + HASH_DEL(_global.videoList, video); + videoUnload(video->handle); + if (video->surface) SDL_FreeSurface(video->surface); + free(video); + result = true; + } + } - if (result) { - luaTrace(L, "videoUnload", "%d", id); - } else { - luaDie(L, "videoUnload", "Failed!"); - } + if (result) { + luaTrace(L, "videoUnload", "%d", id); + } else { + luaDie(L, "videoUnload", "Failed!"); + } - return 0; + return 0; } int32_t apiVldpGetHeight(lua_State *L) { - int32_t height = 0; - if (_global.videoHandle >= 0) height = videoGetHeight(_global.videoHandle); - luaTrace(L, "vldpGetHeight", "%d", height); - lua_pushinteger(L, height); - return 1; + int32_t height = 0; + if (_global.videoHandle >= 0) height = videoGetHeight(_global.videoHandle); + luaTrace(L, "vldpGetHeight", "%d", height); + lua_pushinteger(L, height); + return 1; } int32_t apiVldpGetPixel(lua_State *L) { - int32_t n = lua_gettop(L); - double d = 0; - bool result = false; - byte pixel[SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32)]; - SDL_Rect rect; + int32_t n = lua_gettop(L); + double d = 0; + bool result = false; + byte pixel[SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32)]; + SDL_Rect rect; - if (n == 2) { - if (lua_isnumber(L, 1)) { - if (lua_isnumber(L, 2)) { - rect.h = 1; - rect.w = 1; - d = lua_tonumber(L, 1); rect.x = (int32_t)(d / _global.overlayScaleX); - d = lua_tonumber(L, 2); rect.y = (int32_t)(d / _global.overlayScaleY); - if (SDL_SetRenderTarget(_global.renderer, _global.videoTexture) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); - if (SDL_RenderReadPixels(_global.renderer, &rect, SDL_PIXELFORMAT_BGRA32, pixel, SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32) * videoGetWidth(_global.videoHandle)) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); - if (SDL_SetRenderTarget(_global.renderer, NULL) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); - result = true; - } - } - } + if (n == 2) { + if (lua_isnumber(L, 1)) { + if (lua_isnumber(L, 2)) { + rect.h = 1; + rect.w = 1; + d = lua_tonumber(L, 1); rect.x = (int32_t)(d / _global.overlayScaleX); + d = lua_tonumber(L, 2); rect.y = (int32_t)(d / _global.overlayScaleY); + if (SDL_SetRenderTarget(_global.renderer, _global.videoTexture) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); + if (SDL_RenderReadPixels(_global.renderer, &rect, SDL_PIXELFORMAT_BGRA32, pixel, SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32) * videoGetWidth(_global.videoHandle)) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); + if (SDL_SetRenderTarget(_global.renderer, NULL) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); + result = true; + } + } + } - if (result) { - luaTrace(L, "vldpGetPixel", "%d %d %d %d %d", rect.x, rect.y, pixel[2], pixel[1], pixel[0]); - } else { - luaDie(L, "vldpGetPixel", "Failed!"); - } + if (result) { + luaTrace(L, "vldpGetPixel", "%d %d %d %d %d", rect.x, rect.y, pixel[2], pixel[1], pixel[0]); + } else { + luaDie(L, "vldpGetPixel", "Failed!"); + } - lua_pushinteger(L, (int32_t)pixel[2]); // R - lua_pushinteger(L, (int32_t)pixel[1]); // G - lua_pushinteger(L, (int32_t)pixel[0]); // B + lua_pushinteger(L, (int32_t)pixel[2]); // R + lua_pushinteger(L, (int32_t)pixel[1]); // G + lua_pushinteger(L, (int32_t)pixel[0]); // B - return 3; + return 3; } int32_t apiVldpGetWidth(lua_State *L) { - int32_t width = 0; - if (_global.videoHandle >= 0) width = videoGetWidth(_global.videoHandle); - luaTrace(L, "vldpGetHeight", "%d", width); - lua_pushinteger(L, width); - return 1; + int32_t width = 0; + if (_global.videoHandle >= 0) width = videoGetWidth(_global.videoHandle); + luaTrace(L, "vldpGetHeight", "%d", width); + lua_pushinteger(L, width); + return 1; } int32_t apiVldpVerbose(lua_State *L) { - /* - * Enables/Disables writing of VLDP playback activity to daphne_log.txt - * Enabled by default. - */ - (void)L; + /* + * Enables/Disables writing of VLDP playback activity to daphne_log.txt + * Enabled by default. + */ + (void)L; - //***REMOVED*** - luaTrace(L, "vldpVerbose", "Unimplemented"); + //***REMOVED*** + luaTrace(L, "vldpVerbose", "Unimplemented"); - return 0; + return 0; } int32_t apiKeyboardGetMode(lua_State *L) { - luaTrace(L, "keyboardGetMode", "%d", _global.keyboardMode); - lua_pushinteger(L, _global.keyboardMode); - return 1; + luaTrace(L, "keyboardGetMode", "%d", _global.keyboardMode); + lua_pushinteger(L, _global.keyboardMode); + return 1; } int32_t apiKeyboardSetMode(lua_State *L) { - /* - * Singe can scan keyboard input in two ways: - * - * MODE_NORMAL - Singe will only check for keys defined - * in daphne.ini. This is the default behavior. - * - * MODE_FULL - Singe will scan the keyboard for most keypresses. - * - */ + /* + * Singe can scan keyboard input in two ways: + * + * MODE_NORMAL - Singe will only check for keys defined + * in daphne.ini. This is the default behavior. + * + * MODE_FULL - Singe will scan the keyboard for most keypresses. + * + */ - int32_t n = lua_gettop(L); - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + double d = 0; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); _global.keyboardMode = (int32_t)d; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); _global.keyboardMode = (int32_t)d; + result = true; + } + } - if (result) { - luaTrace(L, "keyboardSetMode", "%d", _global.keyboardMode); - } else { - luaDie(L, "keyboardSetMode", "Failed!"); - } + if (result) { + luaTrace(L, "keyboardSetMode", "%d", _global.keyboardMode); + } else { + luaDie(L, "keyboardSetMode", "Failed!"); + } - return 0; + return 0; } int32_t apiMouseEnable(lua_State *L) { - // Enables mouse monitoring - (void)L; - luaTrace(L, "mouseEnable", "%d", _global.conf->noMouse); - _global.mouseEnabled = (bool)!_global.conf->noMouse; - return 0; + // Enables mouse monitoring + (void)L; + luaTrace(L, "mouseEnable", "%d", _global.conf->noMouse); + _global.mouseEnabled = (bool)!_global.conf->noMouse; + return 0; } int32_t apiMouseDisable(lua_State *L) { - // Disables mouse monitoring - (void)L; - luaTrace(L, "mouseDisable", ""); - _global.mouseEnabled = false; - return 0; + // Disables mouse monitoring + (void)L; + luaTrace(L, "mouseDisable", ""); + _global.mouseEnabled = false; + return 0; } int32_t apiMouseSetCaptured(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; + int32_t n = lua_gettop(L); + bool result = false; - if (n == 1) { - if (lua_isboolean(L, 1)) { - _global.mouseGrabbed = (bool)lua_toboolean(L, 1); - if (_global.mouseGrabbed) { - // Grab mouse - SDL_SetWindowGrab(_global.window, SDL_TRUE); - SDL_ShowCursor(SDL_DISABLE); - } else { - // Ungrab mouse - SDL_SetWindowGrab(_global.window, SDL_FALSE); - SDL_ShowCursor(SDL_ENABLE); - } - result = true; - } - } + if (n == 1) { + if (lua_isboolean(L, 1)) { + _global.mouseGrabbed = (bool)lua_toboolean(L, 1); + if (_global.mouseGrabbed) { + // Grab mouse + SDL_SetWindowGrab(_global.window, SDL_TRUE); + SDL_ShowCursor(SDL_DISABLE); + } else { + // Ungrab mouse + SDL_SetWindowGrab(_global.window, SDL_FALSE); + SDL_ShowCursor(SDL_ENABLE); + } + result = true; + } + } - if (result) { - luaTrace(L, "mouseSetCaptured", "%d", _global.mouseGrabbed); - } else { - luaDie(L, "mouseSetCaptured", "Failed!"); - } + if (result) { + luaTrace(L, "mouseSetCaptured", "%d", _global.mouseGrabbed); + } else { + luaDie(L, "mouseSetCaptured", "Failed!"); + } - return 0; + return 0; } int32_t apiMouseSetMode(lua_State *L) { - // Sets the scanning mode for mouse input. - // Can be one of two values: - // - // SINGLE_MOUSE = 100 - // MANY_MOUSE = 200 - // - // Be sure to add these constant declarations to your framework.singe - // By default Singe starts in single mouse mode. - // Use this command if you need to scan multiple mice. - // e.g. lua code, - // - // mouseSetMode(MANY_MOUSE) - // - // Function returns TRUE is mode set was successful, FALSE otherwise. - // - // --rdg + // Sets the scanning mode for mouse input. + // Can be one of two values: + // + // SINGLE_MOUSE = 100 + // MANY_MOUSE = 200 + // + // Be sure to add these constant declarations to your framework.singe + // By default Singe starts in single mouse mode. + // Use this command if you need to scan multiple mice. + // e.g. lua code, + // + // mouseSetMode(MANY_MOUSE) + // + // Function returns TRUE is mode set was successful, FALSE otherwise. + // + // --rdg - int32_t n = lua_gettop(L); - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + double d = 0; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); _global.mouseMode = (int32_t)d; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); _global.mouseMode = (int32_t)d; + result = true; + } + } - //utilSay("MouseMode now %d", _global.mouseMode); + //utilSay("MouseMode now %d", _global.mouseMode); - if (result) { - luaTrace(L, "mouseSetMode", "%d", _global.mouseMode); - } else { - luaDie(L, "mouseSetMode", "Failed!"); - } + if (result) { + luaTrace(L, "mouseSetMode", "%d", _global.mouseMode); + } else { + luaDie(L, "mouseSetMode", "Failed!"); + } - lua_pushboolean(L, result); - return 1; + lua_pushboolean(L, result); + return 1; } int32_t apiMouseGetPosition(lua_State *L) { - int32_t n = lua_gettop(L); - int32_t m = 0; - int32_t x = 0; - int32_t y = 0; - double d = 0; - bool result = false; + int32_t n = lua_gettop(L); + int32_t m = 0; + int32_t x = 0; + int32_t y = 0; + double d = 0; + bool result = false; - if (n == 1) { - if (lua_isnumber(L, 1)) { - d = lua_tonumber(L, 1); m = (int32_t)d; - if ((m < 0) || (m >= MAX_MICE)) luaDie(L, "mouseGetPosition", "Invalid mouse index: %d", m); - x = _global.axisCache[MAX_CONTROLLERS * CONTROLLER_AXIS_COUNT + m * MOUSE_AXIS_COUNT]; - y = _global.axisCache[MAX_CONTROLLERS * CONTROLLER_AXIS_COUNT + m * MOUSE_AXIS_COUNT + 1]; - result = true; - } - } + if (n == 1) { + if (lua_isnumber(L, 1)) { + d = lua_tonumber(L, 1); m = (int32_t)d; + if ((m < 0) || (m >= MAX_MICE)) luaDie(L, "mouseGetPosition", "Invalid mouse index: %d", m); + x = _global.axisCache[MAX_CONTROLLERS * CONTROLLER_AXIS_COUNT + m * MOUSE_AXIS_COUNT]; + y = _global.axisCache[MAX_CONTROLLERS * CONTROLLER_AXIS_COUNT + m * MOUSE_AXIS_COUNT + 1]; + result = true; + } + } - if (result) { - luaTrace(L, "mouseGetPosition", "%d %d %d", m, x, y); - } else { - luaDie(L, "mouseGetPosition", "Failed!"); - } + if (result) { + luaTrace(L, "mouseGetPosition", "%d %d %d", m, x, y); + } else { + luaDie(L, "mouseGetPosition", "Failed!"); + } - lua_pushinteger(L, x); - lua_pushinteger(L, y); + lua_pushinteger(L, x); + lua_pushinteger(L, y); - return 2; + return 2; } int32_t apiMouseHowMany(lua_State *L) { - luaTrace(L, "mouseHowMany", "%d", _global.mouseCount); - lua_pushinteger(L, _global.mouseCount); - return 1; + luaTrace(L, "mouseHowMany", "%d", _global.mouseCount); + lua_pushinteger(L, _global.mouseCount); + return 1; } int32_t apiDiscGetHeight(lua_State *L) { - int32_t r = 0; - if (_global.videoHandle >= 0) r = videoGetHeight(_global.videoHandle); - luaTrace(L, "discGetHeight", "%d", r); - lua_pushinteger(L, r); - return 1; + int32_t r = 0; + if (_global.videoHandle >= 0) r = videoGetHeight(_global.videoHandle); + luaTrace(L, "discGetHeight", "%d", r); + lua_pushinteger(L, r); + return 1; } int32_t apiDiscGetWidth(lua_State *L) { - int32_t r = 0; - if (_global.videoHandle >= 0) r = videoGetWidth(_global.videoHandle); - luaTrace(L, "discGetWidth", "%d", r); - lua_pushinteger(L, r); - return 1; + int32_t r = 0; + if (_global.videoHandle >= 0) r = videoGetWidth(_global.videoHandle); + luaTrace(L, "discGetWidth", "%d", r); + lua_pushinteger(L, r); + return 1; } int32_t apiDiscGetState(lua_State *L) { - int32_t isPlaying = -1; + int32_t isPlaying = -1; - /* - * Returns the status of the vldp - * Values returned are - * based on the following enumeration (found in ldp.h). - * - * LDP_ERROR = 0 - * LDP_SEARCHING = 1 - * LDP_STOPPED = 2 - * LDP_PLAYING = 3 - * LDP_PAUSED = 4 - * - */ + /* + * Returns the status of the vldp + * Values returned are + * based on the following enumeration (found in ldp.h). + * + * LDP_ERROR = 0 + * LDP_SEARCHING = 1 + * LDP_STOPPED = 2 + * LDP_PLAYING = 3 + * LDP_PAUSED = 4 + * + */ - // Our player isn't as sophisticated as the one in Daphne - if (_global.videoHandle >= 0) isPlaying = videoIsPlaying(_global.videoHandle); - luaTrace(L, "discGetState", "%s", _global.discStopped ? "Stopped" : (isPlaying ? "Playing" : "Paused")); - lua_pushinteger(L, _global.discStopped ? LDP_STOPPED : (isPlaying ? LDP_PLAYING : LDP_PAUSED)); - return 1; + // Our player isn't as sophisticated as the one in Daphne + if (_global.videoHandle >= 0) isPlaying = videoIsPlaying(_global.videoHandle); + luaTrace(L, "discGetState", "%s", _global.discStopped ? "Stopped" : (isPlaying ? "Playing" : "Paused")); + lua_pushinteger(L, _global.discStopped ? LDP_STOPPED : (isPlaying ? LDP_PLAYING : LDP_PAUSED)); + return 1; } int32_t apiScriptExecute(lua_State *L) { - int32_t n = lua_gettop(L); - ConfigT *conf = NULL; - bool result = false; + int32_t n = lua_gettop(L); + ConfigT *conf = NULL; + bool result = false; - if (n == 1) { - if (lua_istable(L, 1)) { - // Push next script. - conf = buildConfFromTable(L); - queueScript(conf); - destroyConf(&conf); - // Stop this script running. - _global.running = false; - result = true; - } - } + if (n == 1) { + if (lua_istable(L, 1)) { + // Push next script. + conf = buildConfFromTable(L); + queueScript(conf); + destroyConf(&conf); + // Stop this script running. + _global.running = false; + result = true; + } + } - if (result) { - luaTrace(L, "scriptExecute", "Success."); - } else { - luaDie(L, "scriptExecute", "Failed!"); - } + if (result) { + luaTrace(L, "scriptExecute", "Success."); + } else { + luaDie(L, "scriptExecute", "Failed!"); + } - return 0; + return 0; } int32_t apiScriptPush(lua_State *L) { - int32_t n = lua_gettop(L); - ConfigT *conf = NULL; - bool result = false; + int32_t n = lua_gettop(L); + ConfigT *conf = NULL; + bool result = false; - if (n == 1) { - if (lua_istable(L, 1)) { - // Push next script. - conf = buildConfFromTable(L); - queueScript(conf); - destroyConf(&conf); - // Push this script. - queueScript(_global.conf); - // Stop this script running. - _global.running = false; - result = true; - } - } + if (n == 1) { + if (lua_istable(L, 1)) { + // Push next script. + conf = buildConfFromTable(L); + queueScript(conf); + destroyConf(&conf); + // Push this script. + queueScript(_global.conf); + // Stop this script running. + _global.running = false; + result = true; + } + } - if (result) { - luaTrace(L, "scriptExecute", "Success."); - } else { - luaDie(L, "scriptExecute", "Failed!"); - } + if (result) { + luaTrace(L, "scriptExecute", "Success."); + } else { + luaDie(L, "scriptExecute", "Failed!"); + } - return 0; + return 0; } int32_t apiSingeGetPauseFlag(lua_State *L) { - /* - * This function returns _global.pauseState's value to the lua script. - * - * Sometimes game logic pauses the game (which implies pausing video playback). - * When implementing a pause state it is possible for the player - * to resume playblack at moments where the game is not intended to. - * Boolean g_global.pause state is an internal variable that keeps track - * of this. It's set to true whenever sep_pre_global.pause is called. - * It's set to false whenever sep_pre_play or sep_skip_to_frame is called. - * - * A lua programmer can use this to prevent resuming playback accidentally. - */ - luaTrace(L, "singeGetPauseFlag", "%d", _global.pauseState); - lua_pushboolean(L, _global.pauseState); - return 1; + /* + * This function returns _global.pauseState's value to the lua script. + * + * Sometimes game logic pauses the game (which implies pausing video playback). + * When implementing a pause state it is possible for the player + * to resume playblack at moments where the game is not intended to. + * Boolean g_global.pause state is an internal variable that keeps track + * of this. It's set to true whenever sep_pre_global.pause is called. + * It's set to false whenever sep_pre_play or sep_skip_to_frame is called. + * + * A lua programmer can use this to prevent resuming playback accidentally. + */ + luaTrace(L, "singeGetPauseFlag", "%d", _global.pauseState); + lua_pushboolean(L, _global.pauseState); + return 1; } int32_t apiSingeSetPauseFlag(lua_State *L) { - int32_t n = lua_gettop(L); - bool result = false; + int32_t n = lua_gettop(L); + bool result = false; - if (n == 1) { - if (lua_isboolean(L, 1)) { - _global.pauseState = (bool)lua_toboolean(L, 1); - updatePauseState(); - result = true; - } - } + if (n == 1) { + if (lua_isboolean(L, 1)) { + _global.pauseState = (bool)lua_toboolean(L, 1); + updatePauseState(); + result = true; + } + } - if (result) { - luaTrace(L, "singeSetPauseFlag", "%d", _global.pauseState); - } else { - luaDie(L, "singeSetPauseFlag", "Failed!"); - } + if (result) { + luaTrace(L, "singeSetPauseFlag", "%d", _global.pauseState); + } else { + luaDie(L, "singeSetPauseFlag", "Failed!"); + } - return 0; + return 0; } int32_t apiSingeEnablePauseKey(lua_State *L) { - (void)L; - luaTrace(L, "singeEnablePauseKey", ""); - _global.pauseEnabled = true; - return 0; + (void)L; + luaTrace(L, "singeEnablePauseKey", ""); + _global.pauseEnabled = true; + return 0; } int32_t apiSingeDisablePauseKey(lua_State *L) { - (void)L; - luaTrace(L, "singeDisablePauseKey", ""); - _global.pauseEnabled = false; - return 0; + (void)L; + luaTrace(L, "singeDisablePauseKey", ""); + _global.pauseEnabled = false; + return 0; } int32_t apiSingeQuit(lua_State *L) { - (void)L; - luaTrace(L, "singeQuit", ""); - _global.running = false; - return 0; + (void)L; + luaTrace(L, "singeQuit", ""); + _global.running = false; + return 0; } int32_t apiSingeVersion(lua_State *L) { - luaTrace(L, "singeVersion", "%f", SINGE_VERSION); - lua_pushnumber(L, SINGE_VERSION); - return 1; + luaTrace(L, "singeVersion", "%f", SINGE_VERSION); + lua_pushnumber(L, SINGE_VERSION); + return 1; } int32_t apiSingeWantsCrosshairs(lua_State *L) { - luaTrace(L, "singeWantsCrosshairs", "%f", !_global.conf->noCrosshair); - lua_pushboolean(L, !_global.conf->noCrosshair); - return 1; + luaTrace(L, "singeWantsCrosshairs", "%f", !_global.conf->noCrosshair); + lua_pushboolean(L, !_global.conf->noCrosshair); + return 1; } int32_t apiSingeGetDataPath(lua_State *L) { - luaTrace(L, "singeGetDataPath", "%s", _global.conf->dataDir); - lua_pushstring(L, _global.conf->dataDir); - return 1; + luaTrace(L, "singeGetDataPath", "%s", _global.conf->dataDir); + lua_pushstring(L, _global.conf->dataDir); + return 1; } int32_t apiSingeSetGameName(lua_State *L) { - // Adds the name of the singe game to the window's title bar. - // Valid value is a string no longer than 25 characters. - // e.g. lua code, - // - // singeSetGameName("My FMV game") - // - // Function returns nothing. - // - // --rdg + // Adds the name of the singe game to the window's title bar. + // Valid value is a string no longer than 25 characters. + // e.g. lua code, + // + // singeSetGameName("My FMV game") + // + // Function returns nothing. + // + // --rdg - int32_t n = lua_gettop(L); - bool result = false; - char thisName[MAX_TITLE_LENGTH]; + int32_t n = lua_gettop(L); + bool result = false; + char thisName[MAX_TITLE_LENGTH]; - if (n == 1) { - if (lua_isstring(L, 1)) { - sprintf(thisName,"%.40s", lua_tostring(L, 1)); // Need a better way to do this...? - SDL_SetWindowTitle(_global.window, thisName); - result = true; - } - } + if (n == 1) { + if (lua_isstring(L, 1)) { + sprintf(thisName,"%.40s", lua_tostring(L, 1)); // Need a better way to do this...? + SDL_SetWindowTitle(_global.window, thisName); + result = true; + } + } - if (result) { - luaTrace(L, "singeSetGameName", "%s", thisName); - } else { - luaDie(L, "singeSetGameName", "Failed!"); - } + if (result) { + luaTrace(L, "singeSetGameName", "%s", thisName); + } else { + luaDie(L, "singeSetGameName", "Failed!"); + } - return 0; + return 0; } int32_t apiSingeGetScriptPath(lua_State *L) { - luaTrace(L, "singeGetScriptPath", "%s", _global.conf->scriptFile); - lua_pushstring(L, _global.conf->scriptFile); - return 1; + luaTrace(L, "singeGetScriptPath", "%s", _global.conf->scriptFile); + lua_pushstring(L, _global.conf->scriptFile); + return 1; } ConfigT *buildConfFromTable(lua_State *L) { - char *sindenString = NULL; - const char *confKey = NULL; - const char *valueString = NULL; - bool valueBoolean = false; - int64_t valueNumber = 0; - ConfigT *c = NULL; + char *sindenString = NULL; + const char *confKey = NULL; + const char *valueString = NULL; + bool valueBoolean = false; + int64_t valueNumber = 0; + ConfigT *c = NULL; - // Start with current config. - c = cloneConf(_global.conf); + // Start with current config. + c = cloneConf(_global.conf); - // Update with data in the table on the top of the Lua stack. - lua_pushnil(L); - while (lua_next(L, 1)) { - // Get key - confKey = lua_tostring(L, 2); + // Update with data in the table on the top of the Lua stack. + lua_pushnil(L); + while (lua_next(L, 1)) { + // Get key + confKey = lua_tostring(L, 2); - // Get value - switch (lua_type(L, 3)) { - case LUA_TSTRING: - valueString = lua_tostring(L, 3); - valueBoolean = false; - valueNumber = 0; - break; + // Get value + switch (lua_type(L, 3)) { + case LUA_TSTRING: + valueString = lua_tostring(L, 3); + valueBoolean = false; + valueNumber = 0; + break; - case LUA_TBOOLEAN: - valueString = NULL; - valueBoolean = lua_toboolean(L, 3); - valueNumber = 0; - break; + case LUA_TBOOLEAN: + valueString = NULL; + valueBoolean = lua_toboolean(L, 3); + valueNumber = 0; + break; - case LUA_TNUMBER: - valueString = NULL; - valueBoolean = false; - valueNumber = lua_tonumber(L, 3); - break; + case LUA_TNUMBER: + valueString = NULL; + valueBoolean = false; + valueNumber = lua_tonumber(L, 3); + break; - default: - valueString = NULL; - valueBoolean = false; - valueNumber = 0; - break; - } + default: + valueString = NULL; + valueBoolean = false; + valueNumber = 0; + break; + } - // Update config with new data - if (strcmp(confKey, "SCRIPT") == 0) { - if (c->scriptFile) free (c->scriptFile); - c->scriptFile = strdup(valueString); - utilFixPathSeparators(&c->scriptFile, false); - } else if (strcmp(confKey, "VIDEO") == 0) { - if (c->videoFile) free(c->videoFile); - c->videoFile = strdup(valueString); - utilFixPathSeparators(&c->videoFile, false); - // Is it a framefile? - if (strncmp(utilGetFileExtension(c->videoFile), "txt", 3) == 0) { - c->isFrameFile = true; - } - } else if (strcmp(confKey, "STRETCH") == 0) { - c->stretchVideo = valueBoolean; - } else if (strcmp(confKey, "NO_MOUSE") == 0) { - c->noMouse = valueBoolean; - } else if (strcmp(confKey, "RESOLUTION_X") == 0) { - c->xResolution = valueNumber; - } else if (strcmp(confKey, "RESOLUTION_Y") == 0) { - c->yResolution = valueNumber; - } else if (strcmp(confKey, "SINDEN_GUN") == 0) { - if (sindenString) free(sindenString); - sindenString = strdup(valueString); - if (!parseSindenString(&sindenString, c)) c->sindenArgc = 0; - free(sindenString); - } + // Update config with new data + if (strcmp(confKey, "SCRIPT") == 0) { + if (c->scriptFile) free (c->scriptFile); + c->scriptFile = strdup(valueString); + utilFixPathSeparators(&c->scriptFile, false); + } else if (strcmp(confKey, "VIDEO") == 0) { + if (c->videoFile) free(c->videoFile); + c->videoFile = strdup(valueString); + utilFixPathSeparators(&c->videoFile, false); + // Is it a framefile? + if (strncmp(utilGetFileExtension(c->videoFile), "txt", 3) == 0) { + c->isFrameFile = true; + } + } else if (strcmp(confKey, "STRETCH") == 0) { + c->stretchVideo = valueBoolean; + } else if (strcmp(confKey, "NO_MOUSE") == 0) { + c->noMouse = valueBoolean; + } else if (strcmp(confKey, "RESOLUTION_X") == 0) { + c->xResolution = valueNumber; + } else if (strcmp(confKey, "RESOLUTION_Y") == 0) { + c->yResolution = valueNumber; + } else if (strcmp(confKey, "SINDEN_GUN") == 0) { + if (sindenString) free(sindenString); + sindenString = strdup(valueString); + if (!parseSindenString(&sindenString, c)) c->sindenArgc = 0; + free(sindenString); + } - // Clean up for next pair - lua_pop(L, 1); - } + // Clean up for next pair + lua_pop(L, 1); + } - // Create new data dir location based on script location. - if (c->dataDir) free(c->dataDir); - c->dataDir = utilCreateString("%s%s", c->dataDirBase, utilGetUpToLastPathComponent(c->scriptFile)); - // Try to create data directory to ensure it exists. - utilMkDirP(c->dataDir, 0777); - // Does it exist? - if (!utilPathExists(c->dataDir)) { - utilDie("Unable to create data directory: %s", c->dataDir); - } + // Create new data dir location based on script location. + if (c->dataDir) free(c->dataDir); + c->dataDir = utilCreateString("%s%s", c->dataDirBase, utilGetUpToLastPathComponent(c->scriptFile)); + // Try to create data directory to ensure it exists. + utilMkDirP(c->dataDir, 0777); + // Does it exist? + if (!utilPathExists(c->dataDir)) { + utilDie("Unable to create data directory: %s", c->dataDir); + } - return c; + return c; } void callLua(const char *func, const char *sig, ...) { - va_list vl; - bool done = false; - int32_t narg; - int32_t nres; - int32_t popCount; - double d; - const int32_t top = lua_gettop(_global.luaContext); + va_list vl; + bool done = false; + int32_t narg; + int32_t nres; + int32_t popCount; + double d; + const int32_t top = lua_gettop(_global.luaContext); - va_start(vl, sig); + va_start(vl, sig); - // Get Function - lua_getglobal(_global.luaContext, func); - if (!lua_isfunction(_global.luaContext, -1)) { - // Function does not exist. Bail. - lua_settop(_global.luaContext, top); - return; - } + // Get Function + lua_getglobal(_global.luaContext, func); + if (!lua_isfunction(_global.luaContext, -1)) { + // Function does not exist. Bail. + lua_settop(_global.luaContext, top); + return; + } - if (_global.conf->scriptTracing) utilTrace("%s", func); + if (_global.conf->scriptTracing) utilTrace("%s", func); - // Push Arguments - narg = 0; - while ((*sig) && (!done)) { - switch (*sig++) { + // Push Arguments + narg = 0; + while ((*sig) && (!done)) { + switch (*sig++) { - case 'd': // Double - lua_pushnumber(_global.luaContext, va_arg(vl, double)); - break; + case 'd': // Double + lua_pushnumber(_global.luaContext, va_arg(vl, double)); + break; - case 'i': // Int - lua_pushinteger(_global.luaContext, va_arg(vl, int)); // Not sure I want to change this to int32_t - break; + case 'i': // Int + lua_pushinteger(_global.luaContext, va_arg(vl, int)); // Not sure I want to change this to int32_t + break; - case 's': // String - lua_pushstring(_global.luaContext, va_arg(vl, char *)); - break; + case 's': // String + lua_pushstring(_global.luaContext, va_arg(vl, char *)); + break; - case '>': - done = true; - break; + case '>': + done = true; + break; - default: - utilDie("Invalid argument option (%c)", *(sig - 1)); - } - if (!done) { - narg++; - luaL_checkstack(_global.luaContext, 1, "Too many arguments"); - } - } + default: + utilDie("Invalid argument option (%c)", *(sig - 1)); + } + if (!done) { + narg++; + luaL_checkstack(_global.luaContext, 1, "Too many arguments"); + } + } - // Do the call - popCount = nres = (int32_t)strlen(sig); // Number of expected results - if (lua_pcall(_global.luaContext, narg, nres, 0) != 0) { - utilSay("Error executing function '%s': %s", func, lua_tostring(_global.luaContext, -1)); - return; - } + // Do the call + popCount = nres = (int32_t)strlen(sig); // Number of expected results + if (lua_pcall(_global.luaContext, narg, nres, 0) != 0) { + utilSay("Error executing function '%s': %s", func, lua_tostring(_global.luaContext, -1)); + return; + } - // Retrieve results - nres = -nres; // Stack index of first result - while (*sig) { - switch (*sig++) { + // Retrieve results + nres = -nres; // Stack index of first result + while (*sig) { + switch (*sig++) { - case 'd': // Double - if (!lua_isnumber(_global.luaContext, nres)) { - utilDie("Wrong result type"); - } - *va_arg(vl, double *) = lua_tonumber(_global.luaContext, nres); - break; + case 'd': // Double + if (!lua_isnumber(_global.luaContext, nres)) { + utilDie("Wrong result type"); + } + *va_arg(vl, double *) = lua_tonumber(_global.luaContext, nres); + break; - case 'i': // Int - if (!lua_isnumber(_global.luaContext, nres)) { - utilDie("Wrong result type"); - } - d = lua_tonumber(_global.luaContext, nres); *va_arg(vl, int *) = (int32_t)d; // Not sure I want to change this to int32_t - break; + case 'i': // Int + if (!lua_isnumber(_global.luaContext, nres)) { + utilDie("Wrong result type"); + } + d = lua_tonumber(_global.luaContext, nres); *va_arg(vl, int *) = (int32_t)d; // Not sure I want to change this to int32_t + break; - case 's': // String - if (!lua_isstring(_global.luaContext, nres)) { - utilDie("Wrong result type"); - } - *va_arg(vl, const char **) = lua_tostring(_global.luaContext, nres); - break; + case 's': // String + if (!lua_isstring(_global.luaContext, nres)) { + utilDie("Wrong result type"); + } + *va_arg(vl, const char **) = lua_tostring(_global.luaContext, nres); + break; - default: - utilDie("Invalid option (%c)", *(sig - 1)); - } - nres++; - } - va_end(vl); + default: + utilDie("Invalid option (%c)", *(sig - 1)); + } + nres++; + } + va_end(vl); - if (popCount > 0) { - lua_pop(_global.luaContext, popCount); - } + if (popCount > 0) { + lua_pop(_global.luaContext, popCount); + } } void channelFinished(int channel) { - callLua("onSoundCompleted", "i", channel); + callLua("onSoundCompleted", "i", channel); } void doIndexDisplay(int32_t percent) { - static int32_t oldW = 0; - static int32_t oldH = 0; - static int32_t screenW = 1280; - static int32_t screenH = 720; - static int32_t radius = 0; - static int32_t angle = 0; - static uint32_t nextUpdate = 0; - static uint32_t updateTicks = 0; - static SDL_Surface *surfDisc = NULL; - static SDL_Surface *surfGlass = NULL; - static SDL_Surface *surfIndex = NULL; - static SDL_Texture *texDisc = NULL; - static SDL_Texture *texGlass = NULL; - static SDL_Texture *texIndex = NULL; + static int32_t oldW = 0; + static int32_t oldH = 0; + static int32_t screenW = 1280; + static int32_t screenH = 720; + static int32_t radius = 0; + static int32_t angle = 0; + static uint32_t nextUpdate = 0; + static uint32_t updateTicks = 0; + static SDL_Surface *surfDisc = NULL; + static SDL_Surface *surfGlass = NULL; + static SDL_Surface *surfIndex = NULL; + static SDL_Texture *texDisc = NULL; + static SDL_Texture *texGlass = NULL; + static SDL_Texture *texIndex = NULL; - SDL_Rect target; - int32_t vShift; + SDL_Rect target; + int32_t vShift; - // If 'percent' is -1, we're setting this display up. - // 'percent' 0 to 100 is the actual display. - // 'percent' -2 shuts the display down. + // If 'percent' is -1, we're setting this display up. + // 'percent' 0 to 100 is the actual display. + // 'percent' -2 shuts the display down. - if (percent == -1) { - // Setup - SDL_RenderGetLogicalSize(_global.renderer, &oldW, &oldH); - SDL_RenderSetLogicalSize(_global.renderer, screenW, screenH); + if (percent == -1) { + // Setup + SDL_RenderGetLogicalSize(_global.renderer, &oldW, &oldH); + SDL_RenderSetLogicalSize(_global.renderer, screenW, screenH); - surfGlass = IMG_LoadPNG_RW(SDL_RWFromMem(magnifyingGlass_png, magnifyingGlass_png_len)); - if (!surfGlass) utilDie("%s", IMG_GetError()); - surfDisc = IMG_LoadPNG_RW(SDL_RWFromMem(laserDisc_png, laserDisc_png_len)); - if (!surfDisc) utilDie("%s", IMG_GetError()); - surfIndex = IMG_LoadPNG_RW(SDL_RWFromMem(indexing_png, indexing_png_len)); - if (!surfIndex) utilDie("%s", IMG_GetError()); + surfGlass = IMG_LoadPNG_RW(SDL_RWFromMem(magnifyingGlass_png, magnifyingGlass_png_len)); + if (!surfGlass) utilDie("%s", IMG_GetError()); + surfDisc = IMG_LoadPNG_RW(SDL_RWFromMem(laserDisc_png, laserDisc_png_len)); + if (!surfDisc) utilDie("%s", IMG_GetError()); + surfIndex = IMG_LoadPNG_RW(SDL_RWFromMem(indexing_png, indexing_png_len)); + if (!surfIndex) utilDie("%s", IMG_GetError()); - texDisc = SDL_CreateTextureFromSurface(_global.renderer, surfDisc); - if (!texDisc) utilDie("%s", SDL_GetError()); - texGlass = SDL_CreateTextureFromSurface(_global.renderer, surfGlass); - if (!texGlass) utilDie("%s", SDL_GetError()); - texIndex = SDL_CreateTextureFromSurface(_global.renderer, surfIndex); - if (!texIndex) utilDie("%s", SDL_GetError()); + texDisc = SDL_CreateTextureFromSurface(_global.renderer, surfDisc); + if (!texDisc) utilDie("%s", SDL_GetError()); + texGlass = SDL_CreateTextureFromSurface(_global.renderer, surfGlass); + if (!texGlass) utilDie("%s", SDL_GetError()); + texIndex = SDL_CreateTextureFromSurface(_global.renderer, surfIndex); + if (!texIndex) utilDie("%s", SDL_GetError()); - radius = surfDisc->w * 0.3; - updateTicks = 5; - nextUpdate = SDL_GetTicks() + updateTicks; - return; - } + radius = surfDisc->w * 0.3; + updateTicks = 5; + nextUpdate = SDL_GetTicks() + updateTicks; + return; + } - if (percent == -2) { - // Shutdown - SDL_DestroyTexture(texDisc); - SDL_DestroyTexture(texGlass); - SDL_DestroyTexture(texIndex); - texDisc = NULL; - texGlass = NULL; - texIndex = NULL; + if (percent == -2) { + // Shutdown + SDL_DestroyTexture(texDisc); + SDL_DestroyTexture(texGlass); + SDL_DestroyTexture(texIndex); + texDisc = NULL; + texGlass = NULL; + texIndex = NULL; - SDL_FreeSurface(surfDisc); - SDL_FreeSurface(surfGlass); - SDL_FreeSurface(surfIndex); - surfDisc = NULL; - surfGlass = NULL; - surfIndex = NULL; + SDL_FreeSurface(surfDisc); + SDL_FreeSurface(surfGlass); + SDL_FreeSurface(surfIndex); + surfDisc = NULL; + surfGlass = NULL; + surfIndex = NULL; - SDL_RenderSetLogicalSize(_global.renderer, oldW, oldH); + SDL_RenderSetLogicalSize(_global.renderer, oldW, oldH); - SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); - SDL_RenderClear(_global.renderer); - SDL_RenderPresent(_global.renderer); - return; - } + SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); + SDL_RenderClear(_global.renderer); + SDL_RenderPresent(_global.renderer); + return; + } - // Display animation - SDL_RenderSetLogicalSize(_global.renderer, screenW, screenH); - SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); - SDL_RenderClear(_global.renderer); + // Display animation + SDL_RenderSetLogicalSize(_global.renderer, screenW, screenH); + SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); + SDL_RenderClear(_global.renderer); - // Draw "Indexing" text - vShift = surfIndex->h - 5; - target.x = (screenW * 0.5) - (surfIndex->w * 0.5); - target.y = screenH - vShift; - target.w = surfIndex->w; - target.h = surfIndex->h; - SDL_RenderCopy(_global.renderer, texIndex, NULL, &target); + // Draw "Indexing" text + vShift = surfIndex->h - 5; + target.x = (screenW * 0.5) - (surfIndex->w * 0.5); + target.y = screenH - vShift; + target.w = surfIndex->w; + target.h = surfIndex->h; + SDL_RenderCopy(_global.renderer, texIndex, NULL, &target); - // Draw laserdisc - target.x = (screenW * 0.5) - (surfDisc->w * 0.5); - target.y = (screenH * 0.5) - (surfDisc->h * 0.5) - vShift; - target.w = surfDisc->w; - target.h = surfDisc->h; - SDL_RenderCopy(_global.renderer, texDisc, NULL, &target); + // Draw laserdisc + target.x = (screenW * 0.5) - (surfDisc->w * 0.5); + target.y = (screenH * 0.5) - (surfDisc->h * 0.5) - vShift; + target.w = surfDisc->w; + target.h = surfDisc->h; + SDL_RenderCopy(_global.renderer, texDisc, NULL, &target); - // Draw magnifying glass - target.x = (surfDisc->w * 0.15) + (screenW * 0.5) - (surfGlass->w * 0.5) + cos(angle * M_PI / 180) * radius; - target.y = (surfDisc->h * 0.1) + (screenH * 0.5) - vShift - (surfGlass->h * 0.5) + sin(angle * M_PI / 180) * radius; - target.w = surfGlass->w; - target.h = surfGlass->h; - SDL_RenderCopy(_global.renderer, texGlass, NULL, &target); + // Draw magnifying glass + target.x = (surfDisc->w * 0.15) + (screenW * 0.5) - (surfGlass->w * 0.5) + cos(angle * M_PI / 180) * radius; + target.y = (surfDisc->h * 0.1) + (screenH * 0.5) - vShift - (surfGlass->h * 0.5) + sin(angle * M_PI / 180) * radius; + target.w = surfGlass->w; + target.h = surfGlass->h; + SDL_RenderCopy(_global.renderer, texGlass, NULL, &target); - // Update animation - if (SDL_GetTicks() > nextUpdate) { - //angle += (SDL_GetTicks() - nextUpdate) / updateTicks; - angle++; - if (angle > 359) angle -= 360; - nextUpdate = SDL_GetTicks() + updateTicks; - } + // Update animation + if (SDL_GetTicks() > nextUpdate) { + //angle += (SDL_GetTicks() - nextUpdate) / updateTicks; + angle++; + if (angle > 359) angle -= 360; + nextUpdate = SDL_GetTicks() + updateTicks; + } - SDL_RenderPresent(_global.renderer); + SDL_RenderPresent(_global.renderer); } void doLogos(void) { - int32_t i = 0; - int32_t w = 0; - int32_t h = 0; - SDL_Surface *surfKangaroo = NULL; - SDL_Surface *surfSinge = NULL; - SDL_Texture *texKangaroo = NULL; - SDL_Texture *texSinge = NULL; + int32_t i = 0; + int32_t w = 0; + int32_t h = 0; + SDL_Surface *surfKangaroo = NULL; + SDL_Surface *surfSinge = NULL; + SDL_Texture *texKangaroo = NULL; + SDL_Texture *texSinge = NULL; - SDL_RenderGetLogicalSize(_global.renderer, &w, &h); + SDL_RenderGetLogicalSize(_global.renderer, &w, &h); - surfKangaroo = IMG_LoadPNG_RW(SDL_RWFromMem(kangarooPunchLogo_png, kangarooPunchLogo_png_len)); - if (!surfKangaroo) utilDie("%s", IMG_GetError()); - surfSinge = IMG_LoadPNG_RW(SDL_RWFromMem(singeLogo_png, singeLogo_png_len)); - if (!surfSinge) utilDie("%s", IMG_GetError()); + surfKangaroo = IMG_LoadPNG_RW(SDL_RWFromMem(kangarooPunchLogo_png, kangarooPunchLogo_png_len)); + if (!surfKangaroo) utilDie("%s", IMG_GetError()); + surfSinge = IMG_LoadPNG_RW(SDL_RWFromMem(singeLogo_png, singeLogo_png_len)); + if (!surfSinge) utilDie("%s", IMG_GetError()); - texKangaroo = SDL_CreateTextureFromSurface(_global.renderer, surfKangaroo); - if (!texKangaroo) utilDie("%s", SDL_GetError()); - texSinge = SDL_CreateTextureFromSurface(_global.renderer, surfSinge); - if (!texSinge) utilDie("%s", SDL_GetError()); + texKangaroo = SDL_CreateTextureFromSurface(_global.renderer, surfKangaroo); + if (!texKangaroo) utilDie("%s", SDL_GetError()); + texSinge = SDL_CreateTextureFromSurface(_global.renderer, surfSinge); + if (!texSinge) utilDie("%s", SDL_GetError()); - // Fade in to white with Kangaroo logo - SDL_RenderSetLogicalSize(_global.renderer, surfKangaroo->w, surfKangaroo->h); - for (i=0; i<256; i++) { - SDL_SetRenderDrawColor(_global.renderer, i, i, i, 255); - SDL_RenderClear(_global.renderer); - SDL_SetTextureAlphaMod(texKangaroo, i); - SDL_RenderCopy(_global.renderer, texKangaroo, NULL, NULL); - SDL_RenderPresent(_global.renderer); - SDL_Delay(3); - } + // Fade in to white with Kangaroo logo + SDL_RenderSetLogicalSize(_global.renderer, surfKangaroo->w, surfKangaroo->h); + for (i=0; i<256; i++) { + SDL_SetRenderDrawColor(_global.renderer, i, i, i, 255); + SDL_RenderClear(_global.renderer); + SDL_SetTextureAlphaMod(texKangaroo, i); + SDL_RenderCopy(_global.renderer, texKangaroo, NULL, NULL); + SDL_RenderPresent(_global.renderer); + SDL_Delay(3); + } - SDL_Delay(750); + SDL_Delay(750); - // Cross fade to Singe logo - for (i=0; i<256; i++) { - SDL_RenderClear(_global.renderer); - SDL_SetTextureAlphaMod(texKangaroo, 255 - i); - SDL_RenderCopy(_global.renderer, texKangaroo, NULL, NULL); - SDL_SetTextureAlphaMod(texSinge, i); - SDL_RenderCopy(_global.renderer, texSinge, NULL, NULL); - SDL_RenderPresent(_global.renderer); - SDL_Delay(3); - } + // Cross fade to Singe logo + for (i=0; i<256; i++) { + SDL_RenderClear(_global.renderer); + SDL_SetTextureAlphaMod(texKangaroo, 255 - i); + SDL_RenderCopy(_global.renderer, texKangaroo, NULL, NULL); + SDL_SetTextureAlphaMod(texSinge, i); + SDL_RenderCopy(_global.renderer, texSinge, NULL, NULL); + SDL_RenderPresent(_global.renderer); + SDL_Delay(3); + } - SDL_Delay(750); + SDL_Delay(750); - // Fade to black - SDL_RenderSetLogicalSize(_global.renderer, surfSinge->w, surfSinge->h); - for (i=255; i>=0; i--) { - SDL_SetRenderDrawColor(_global.renderer, i, i, i, 255); - SDL_RenderClear(_global.renderer); - SDL_SetTextureAlphaMod(texSinge, i); - SDL_RenderCopy(_global.renderer, texSinge, NULL, NULL); - SDL_RenderPresent(_global.renderer); - SDL_Delay(3); - } + // Fade to black + SDL_RenderSetLogicalSize(_global.renderer, surfSinge->w, surfSinge->h); + for (i=255; i>=0; i--) { + SDL_SetRenderDrawColor(_global.renderer, i, i, i, 255); + SDL_RenderClear(_global.renderer); + SDL_SetTextureAlphaMod(texSinge, i); + SDL_RenderCopy(_global.renderer, texSinge, NULL, NULL); + SDL_RenderPresent(_global.renderer); + SDL_Delay(3); + } - SDL_DestroyTexture(texSinge); - SDL_DestroyTexture(texKangaroo); + SDL_DestroyTexture(texSinge); + SDL_DestroyTexture(texKangaroo); - SDL_FreeSurface(surfSinge); - SDL_FreeSurface(surfKangaroo); + SDL_FreeSurface(surfSinge); + SDL_FreeSurface(surfKangaroo); - SDL_RenderSetLogicalSize(_global.renderer, w, h); + SDL_RenderSetLogicalSize(_global.renderer, w, h); } void line(int32_t x1, int32_t y1, int32_t x2, int32_t y2, SDL_Color *c) { - int32_t x = 0; - int32_t y = 0; - int32_t dx = 0; - int32_t dy = 0; - int32_t incX = 0; - int32_t incY = 0; - int32_t balance = 0; + int32_t x = 0; + int32_t y = 0; + int32_t dx = 0; + int32_t dy = 0; + int32_t incX = 0; + int32_t incY = 0; + int32_t balance = 0; - if (x2 >= x1) { - dx = x2 - x1; - incX = 1; - } else { - dx = x1 - x2; - incX = -1; - } + if (x2 >= x1) { + dx = x2 - x1; + incX = 1; + } else { + dx = x1 - x2; + incX = -1; + } - if (y2 >= y1) { - dy = y2 - y1; - incY = 1; - } else { - dy = y1 - y2; - incY = -1; - } + if (y2 >= y1) { + dy = y2 - y1; + incY = 1; + } else { + dy = y1 - y2; + incY = -1; + } - x = x1; - y = y1; + x = x1; + y = y1; - if (dx >= dy) { - dy <<= 1; - balance = dy - dx; - dx <<= 1; - while (x != x2) { - putPixel(x, y, c); - if (balance >= 0) { - y += incY; - balance -= dx; - } - balance += dy; - x += incX; - } - putPixel(x, y, c); - } else { - dx <<= 1; - balance = dx - dy; - dy <<= 1; - while (y != y2) { - putPixel(x, y, c); - if (balance >= 0) { - x += incX; - balance -= dy; - } - balance += dx; - y += incY; - } - putPixel(x, y, c); - } + if (dx >= dy) { + dy <<= 1; + balance = dy - dx; + dx <<= 1; + while (x != x2) { + putPixel(x, y, c); + if (balance >= 0) { + y += incY; + balance -= dx; + } + balance += dy; + x += incX; + } + putPixel(x, y, c); + } else { + dx <<= 1; + balance = dx - dy; + dy <<= 1; + while (y != y2) { + putPixel(x, y, c); + if (balance >= 0) { + x += incX; + balance -= dy; + } + balance += dx; + y += incY; + } + putPixel(x, y, c); + } } void luaDie(lua_State *L, char *method, char *fmt, ...) { - va_list args; - lua_Debug ar; - char *string1 = NULL; - char *string2 = NULL; + va_list args; + lua_Debug ar; + char *string1 = NULL; + char *string2 = NULL; - lua_getstack(L, 1, &ar); - lua_getinfo(L, "nSl", &ar); - string1 = utilCreateString("%d:%s: ", ar.currentline, method); - if (!string1) utilDie("Unable to allocate first trace string."); - va_start(args, fmt); - string2 = utilCreateStringVArgs(fmt, args); - if (!string2) utilDie("Unable to allocate second trace string."); - va_end(args); - if (_global.conf->scriptTracing) utilTrace("%s%s", string1, string2); - utilDie("%s%s", string1, string2); - // Can't free strings - we never get here. + lua_getstack(L, 1, &ar); + lua_getinfo(L, "nSl", &ar); + string1 = utilCreateString("%d:%s: ", ar.currentline, method); + if (!string1) utilDie("Unable to allocate first trace string."); + va_start(args, fmt); + string2 = utilCreateStringVArgs(fmt, args); + if (!string2) utilDie("Unable to allocate second trace string."); + va_end(args); + if (_global.conf->scriptTracing) utilTrace("%s%s", string1, string2); + utilDie("%s%s", string1, string2); + // Can't free strings - we never get here. } int32_t luaError(lua_State *L) { - lua_Debug ar; - int32_t level = 0; + lua_Debug ar; + int32_t level = 0; - utilSay("Singe has panicked! Very bad!"); - utilSay("Error: %s", lua_tostring(L, -1)); + utilSay("Singe has panicked! Very bad!"); + utilSay("Error: %s", lua_tostring(L, -1)); - utilSay("Stack trace:"); - while (lua_getstack(L, level, &ar) != 0) { - lua_getinfo(L, "nSl", &ar); - utilSay(" %d: function `%s' at line %d %s", level, ar.name, ar.currentline, ar.short_src); - level++; - } - utilSay("Trace complete."); + utilSay("Stack trace:"); + while (lua_getstack(L, level, &ar) != 0) { + lua_getinfo(L, "nSl", &ar); + utilSay(" %d: function `%s' at line %d %s", level, ar.name, ar.currentline, ar.short_src); + level++; + } + utilSay("Trace complete."); - return 0; + return 0; } #ifdef DEBUG_TOOLS void luaStackDump(lua_State *L) { - int i; - int t; - int top = lua_gettop(L); + int i; + int t; + int top = lua_gettop(L); - printf("%d: ", top); - for (i=1; i<=top; i++) { - printf("%d - ", i); - t = lua_type(L, i); - switch (t) { - case LUA_TSTRING: - printf("`%s'", lua_tostring(L, i)); - break; + printf("%d: ", top); + for (i=1; i<=top; i++) { + printf("%d - ", i); + t = lua_type(L, i); + switch (t) { + case LUA_TSTRING: + printf("`%s'", lua_tostring(L, i)); + break; - case LUA_TBOOLEAN: - printf(lua_toboolean(L, i) ? "true" : "false"); - break; + case LUA_TBOOLEAN: + printf(lua_toboolean(L, i) ? "true" : "false"); + break; - case LUA_TNUMBER: - printf("%g", lua_tonumber(L, i)); - break; + case LUA_TNUMBER: + printf("%g", lua_tonumber(L, i)); + break; - default: - printf("%s", lua_typename(L, t)); - break; + default: + printf("%s", lua_typename(L, t)); + break; - } - printf(" "); - } - printf("\n"); + } + printf(" "); + } + printf("\n"); } #endif void luaPreload(lua_State *L, const char *name, lua_CFunction func) { - luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); - lua_pushcfunction(L, func); - lua_setfield(L, -2, name); - lua_pop(L, 1); // remove PRELOAD table + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + lua_pushcfunction(L, func); + lua_setfield(L, -2, name); + lua_pop(L, 1); // remove PRELOAD table } void luaTrace(lua_State *L, char *method, char *fmt, ...) { - va_list args; - lua_Debug ar; - char *string1 = NULL; - char *string2 = NULL; + va_list args; + lua_Debug ar; + char *string1 = NULL; + char *string2 = NULL; - if (_global.conf->scriptTracing) { - lua_getstack(L, 1, &ar); - lua_getinfo(L, "nSl", &ar); - string1 = utilCreateString("%d:%s: ", ar.currentline, method); - if (!string1) utilDie("Unable to allocate first trace string."); - va_start(args, fmt); - string2 = utilCreateStringVArgs(fmt, args); - if (!string2) utilDie("Unable to allocate second trace string."); - va_end(args); - utilTrace("%s%s", string1, string2); - free(string2); - free(string1); - } + if (_global.conf->scriptTracing) { + lua_getstack(L, 1, &ar); + lua_getinfo(L, "nSl", &ar); + string1 = utilCreateString("%d:%s: ", ar.currentline, method); + if (!string1) utilDie("Unable to allocate first trace string."); + va_start(args, fmt); + string2 = utilCreateStringVArgs(fmt, args); + if (!string2) utilDie("Unable to allocate second trace string."); + va_end(args); + utilTrace("%s%s", string1, string2); + free(string2); + free(string1); + } } void processKey(bool down, int32_t keysym, int32_t scancode) { - int32_t move; - int32_t index; + int32_t move; + int32_t index; - //utilSay("U:%d SY:%d SC:%d", down, keysym, scancode); + //utilSay("U:%d SY:%d SC:%d", down, keysym, scancode); - if (_global.keyboardMode == KEYBD_NORMAL) { - // Mappable keys - for (move=0; move 0) { - for (index=0; index<_global.controlMappings[move].inputCount; index++) { - //utilSay("Checking %s %d = %d", _global.controlMappings[move].name, _global.controlMappings[move].input[index], scancode); - if (_global.controlMappings[move].input[index] == scancode) { - //utilSay("Sending move %d - %s %d - %s", move, _global.controlMappings[move].name, _global.controlMappings[move].input[index], down ? "down" : "up"); - if (!down) { - if ((move == INPUT_PAUSE) && (_global.pauseEnabled)) { - _global.pauseState = _global.pauseState ? false : true; - updatePauseState(); - } - if (move == INPUT_GRAB) { - if (_global.mouseGrabbed) { - // Ungrab mouse - _global.mouseGrabbed = false; - SDL_SetWindowGrab(_global.window, SDL_FALSE); - SDL_ShowCursor(SDL_ENABLE); - } else { - // Grab mouse - _global.mouseGrabbed = true; - SDL_SetWindowGrab(_global.window, SDL_TRUE); - SDL_ShowCursor(SDL_DISABLE); - } - } - if (move == INPUT_QUIT) { - _global.running = false; - } - if (move == INPUT_SCREENSHOT) { - _global.requestScreenShot = true; - } - } - callLua(down ? "onInputPressed" : "onInputReleased", "i", move); - } - } - } - } - } else { - // Full keyboard - callLua(down ? "onInputPressed" : "onInputReleased", "i", keysym); - callLua(down ? "onKeyPressed" : "onKeyReleased", "ii", keysym, scancode); - } + if (_global.keyboardMode == KEYBD_NORMAL) { + // Mappable keys + for (move=0; move 0) { + for (index=0; index<_global.controlMappings[move].inputCount; index++) { + //utilSay("Checking %s %d = %d", _global.controlMappings[move].name, _global.controlMappings[move].input[index], scancode); + if (_global.controlMappings[move].input[index] == scancode) { + //utilSay("Sending move %d - %s %d - %s", move, _global.controlMappings[move].name, _global.controlMappings[move].input[index], down ? "down" : "up"); + if (!down) { + if ((move == INPUT_PAUSE) && (_global.pauseEnabled)) { + _global.pauseState = _global.pauseState ? false : true; + updatePauseState(); + } + if (move == INPUT_GRAB) { + if (_global.mouseGrabbed) { + // Ungrab mouse + _global.mouseGrabbed = false; + SDL_SetWindowGrab(_global.window, SDL_FALSE); + SDL_ShowCursor(SDL_ENABLE); + } else { + // Grab mouse + _global.mouseGrabbed = true; + SDL_SetWindowGrab(_global.window, SDL_TRUE); + SDL_ShowCursor(SDL_DISABLE); + } + } + if (move == INPUT_QUIT) { + _global.running = false; + } + if (move == INPUT_SCREENSHOT) { + _global.requestScreenShot = true; + } + } + callLua(down ? "onInputPressed" : "onInputReleased", "i", move); + } + } + } + } + } else { + // Full keyboard + callLua(down ? "onInputPressed" : "onInputReleased", "i", keysym); + callLua(down ? "onKeyPressed" : "onKeyReleased", "ii", keysym, scancode); + } } void progTrace(char *fmt, ...) { - va_list args; - if (_global.conf->programTracing) { - va_start(args, fmt); - utilTraceVArgs(fmt, args); - va_end(args); - } + va_list args; + if (_global.conf->programTracing) { + va_start(args, fmt); + utilTraceVArgs(fmt, args); + va_end(args); + } } void putPixel(int32_t x, int32_t y, SDL_Color *c) { - SDL_Surface *surface = _global.overlay; - int32_t bpp = surface->format->BytesPerPixel; - Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; - Uint32 pixel = SDL_MapRGBA(surface->format, c->r, c->g, c->b, c->a); + SDL_Surface *surface = _global.overlay; + int32_t bpp = surface->format->BytesPerPixel; + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; + Uint32 pixel = SDL_MapRGBA(surface->format, c->r, c->g, c->b, c->a); - if ((x < 0) || (x >= _global.overlay->w) || (y < 0) || (y >= _global.overlay->h)) return; + if ((x < 0) || (x >= _global.overlay->w) || (y < 0) || (y >= _global.overlay->h)) return; - switch (bpp) { - case 1: - *p = (Uint8)pixel; - break; + switch (bpp) { + case 1: + *p = (Uint8)pixel; + break; - case 2: - *(Uint16 *)p = (Uint16)pixel; - break; + case 2: + *(Uint16 *)p = (Uint16)pixel; + break; - case 3: - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { - p[0] = (pixel >> 16) & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = pixel & 0xff; - } else { - p[0] = pixel & 0xff; - p[1] = (pixel >> 8) & 0xff; - p[2] = (pixel >> 16) & 0xff; - } - break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } else { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; - case 4: - *(Uint32 *)p = pixel; - break; - } + case 4: + *(Uint32 *)p = pixel; + break; + } } void singe(SDL_Window *window, SDL_Renderer *renderer, ConfigT *conf) { - int32_t x = 0; - int32_t y = 0; - int32_t xr = 0; - int32_t yr = 0; - int32_t intReturn = 0; - int32_t axisIndex = 0; - int64_t thisFrame = -1; - int64_t lastFrame = -1; - uint32_t frameClock = 0; - bool changed = false; - char *temp = NULL; - char *temp2 = NULL; - SDL_Rect windowTarget; - SDL_Rect sindenWhite; - SDL_Rect sindenBlack; - SDL_Color sindenWhiteColor = { 255, 255, 255, 255 }; - SDL_Color sindenBlackColor = { 0, 0, 0, 255 };; - SDL_Texture *overlayTexture = NULL; - SpriteT *sprite = NULL; - SpriteT *spriteTemp = NULL; - SoundT *sound = NULL; - SoundT *soundTemp = NULL; - FontT *font = NULL; - FontT *fontTemp = NULL; - VideoT *video = NULL; - VideoT *videoTemp = NULL; - SDL_Event event; - ManyMouseEvent mouseEvent; - MouseT *mouse = NULL; - int32_t lastAnalogDirection[AXIS_COUNT]; - //float val = 0; - //float maxval = 0; - int32_t lastMouseX = 0; - int32_t lastMouseY = 0; + int32_t x = 0; + int32_t y = 0; + int32_t xr = 0; + int32_t yr = 0; + int32_t intReturn = 0; + int32_t axisIndex = 0; + int64_t thisFrame = -1; + int64_t lastFrame = -1; + uint32_t frameClock = 0; + bool changed = false; + char *temp = NULL; + char *temp2 = NULL; + SDL_Rect windowTarget; + SDL_Rect sindenWhite; + SDL_Rect sindenBlack; + SDL_Color sindenWhiteColor = { 255, 255, 255, 255 }; + SDL_Color sindenBlackColor = { 0, 0, 0, 255 };; + SDL_Texture *overlayTexture = NULL; + SpriteT *sprite = NULL; + SpriteT *spriteTemp = NULL; + SoundT *sound = NULL; + SoundT *soundTemp = NULL; + FontT *font = NULL; + FontT *fontTemp = NULL; + VideoT *video = NULL; + VideoT *videoTemp = NULL; + SDL_Event event; + ManyMouseEvent mouseEvent; + MouseT *mouse = NULL; + int32_t lastAnalogDirection[AXIS_COUNT]; + //float val = 0; + //float maxval = 0; + int32_t lastMouseX = 0; + int32_t lastMouseY = 0; - // Set up globals - memset(&_global, 0, sizeof(GlobalT)); - _global.colorForeground.r = 255; - _global.colorForeground.g = 255; - _global.colorForeground.b = 255; - _global.colorForeground.a = 255; - _global.effectsVolume = AUDIO_MAX_VOLUME; - _global.keyboardMode = KEYBD_NORMAL; - _global.frameFileHandle = -1; - _global.videoHandle = -1; - _global.fontQuality = FONT_QUALITY_SOLID; - _global.mouseMode = MOUSE_SINGLE; - _global.overlayScaleX = 1; - _global.overlayScaleY = 1; - _global.pauseEnabled = true; - _global.running = true; - _global.discStopped = true; - _global.mouseEnabled = true; + // Set up globals + memset(&_global, 0, sizeof(GlobalT)); + _global.colorForeground.r = 255; + _global.colorForeground.g = 255; + _global.colorForeground.b = 255; + _global.colorForeground.a = 255; + _global.effectsVolume = AUDIO_MAX_VOLUME; + _global.keyboardMode = KEYBD_NORMAL; + _global.frameFileHandle = -1; + _global.videoHandle = -1; + _global.fontQuality = FONT_QUALITY_SOLID; + _global.mouseMode = MOUSE_SINGLE; + _global.overlayScaleX = 1; + _global.overlayScaleY = 1; + _global.pauseEnabled = true; + _global.running = true; + _global.discStopped = true; + _global.mouseEnabled = true; - // Local copy of config - _global.conf = cloneConf(conf); + // Local copy of config + _global.conf = cloneConf(conf); - // Input mappings - _global.controlMappings[INPUT_UP].name = "INPUT_UP"; - _global.controlMappings[INPUT_LEFT].name = "INPUT_LEFT"; - _global.controlMappings[INPUT_DOWN].name = "INPUT_DOWN"; - _global.controlMappings[INPUT_RIGHT].name = "INPUT_RIGHT"; - _global.controlMappings[INPUT_1P_START].name = "INPUT_1P_START"; - _global.controlMappings[INPUT_2P_START].name = "INPUT_2P_START"; - _global.controlMappings[INPUT_ACTION_1].name = "INPUT_ACTION_1"; - _global.controlMappings[INPUT_ACTION_2].name = "INPUT_ACTION_2"; - _global.controlMappings[INPUT_ACTION_3].name = "INPUT_ACTION_3"; - _global.controlMappings[INPUT_1P_COIN].name = "INPUT_1P_COIN"; - _global.controlMappings[INPUT_2P_COIN].name = "INPUT_2P_COIN"; - _global.controlMappings[INPUT_SKILL_EASY].name = "INPUT_SKILL_EASY"; - _global.controlMappings[INPUT_SKILL_MEDIUM].name = "INPUT_SKILL_MEDIUM"; - _global.controlMappings[INPUT_SKILL_HARD].name = "INPUT_SKILL_HARD"; - _global.controlMappings[INPUT_SERVICE].name = "INPUT_SERVICE"; - _global.controlMappings[INPUT_TEST_MODE].name = "INPUT_TEST_MODE"; - _global.controlMappings[INPUT_RESET_CPU].name = "INPUT_RESET_CPU"; - _global.controlMappings[INPUT_SCREENSHOT].name = "INPUT_SCREENSHOT"; - _global.controlMappings[INPUT_QUIT].name = "INPUT_QUIT"; - _global.controlMappings[INPUT_PAUSE].name = "INPUT_PAUSE"; - _global.controlMappings[INPUT_CONSOLE].name = "INPUT_CONSOLE"; - _global.controlMappings[INPUT_ACTION_4].name = "INPUT_ACTION_4"; - _global.controlMappings[INPUT_TILT].name = "INPUT_TILT"; - _global.controlMappings[INPUT_GRAB].name = "INPUT_GRAB"; - for (x=0; xdataDir, utilGetPathSeparator()); - if (utilFileExists(temp)) { - progTrace("Loading %s", temp); - if (luaL_dofile(_global.luaContext, temp)) utilDie("%s", lua_tostring(_global.luaContext, -1)); - } - free(temp); - // Load mappings in game data dir - temp = utilCreateString("%scontrols.cfg", _global.conf->dataDir); - if (utilFileExists(temp)) { - progTrace("Loading %s", temp); - if (luaL_dofile(_global.luaContext, temp)) utilDie("%s", lua_tostring(_global.luaContext, -1)); - } - free(temp); - // Load mappings in game script dir - temp = strdup(_global.conf->scriptFile); - temp2 = utilStrndup(temp, strlen(temp) - strlen(utilGetLastPathComponent(temp))); - free(temp); - temp = utilCreateString("%scontrols.cfg", temp2); - if (utilFileExists(temp)) { - progTrace("Loading %s", temp); - if (luaL_dofile(_global.luaContext, temp)) utilDie("%s", lua_tostring(_global.luaContext, -1)); - } - free(temp); - free(temp2); - // Parse results - lua_getglobal(_global.luaContext, "DEAD_ZONE"); - if (lua_isnumber(_global.luaContext, -1)) { - _global.controllerDeadZone = (int32_t)lua_tonumber(_global.luaContext, -1); - progTrace("Controller dead zone is %d", _global.controllerDeadZone); - } - lua_pop(_global.luaContext, 1); - for (x=0; x 0) { - _global.controlMappings[x].inputCount = y; - _global.controlMappings[x].input = (int32_t *)malloc(sizeof(int32_t) * y); - if (!_global.controlMappings[x].input) utilDie("Unable to allocate memory for control mappings."); - } - } else { - utilSay("Configuration option %s missing!", _global.controlMappings[x].name); - } - lua_pop(_global.luaContext, 1); - // Then load them for real. - lua_getglobal(_global.luaContext, _global.controlMappings[x].name); - if (lua_istable(_global.luaContext, -1)) { - y = 0; - lua_pushnil(_global.luaContext); - while (lua_next(_global.luaContext, -2)) { - if (lua_istable(_global.luaContext, -1)) { - lua_pushnil(_global.luaContext); - while (lua_next(_global.luaContext, -2)) { - if (lua_type(_global.luaContext, -2) == LUA_TSTRING) { - if (utilStricmp((char *)lua_tostring(_global.luaContext, -2), "value") == 0) { - _global.controlMappings[x].input[y++] = (int32_t)lua_tonumber(_global.luaContext, -1); - } - } - lua_pop(_global.luaContext, 1); - } - } - lua_pop(_global.luaContext, 1); - } - } - lua_pop(_global.luaContext, 1); - } - lua_close(_global.luaContext); + // Load controller mappings + progTrace("Creating Lua context for Singe setup"); + _global.luaContext = luaL_newstate(); + startLuaContext(_global.luaContext); + // Load framework + progTrace("Loading Singe framework"); + if (luaL_loadbuffer(_global.luaContext, (char *)Framework_singe, Framework_singe_len, "Input Mappings") || lua_pcall(_global.luaContext, 0, 0, 0)) utilDie("%s", lua_tostring(_global.luaContext, -1)); + // Load default mappings + progTrace("Loading default control mappings"); + if (luaL_loadbuffer(_global.luaContext, (char *)controls_cfg, controls_cfg_len, "Input Mappings") || lua_pcall(_global.luaContext, 0, 0, 0)) utilDie("%s", lua_tostring(_global.luaContext, -1)); + if (utilFileExists("controls.cfg")) { + progTrace("Loading controls.cfg"); + if (luaL_dofile(_global.luaContext, "controls.cfg")) utilDie("%s", lua_tostring(_global.luaContext, -1)); + } + // Load mappings in main data dir + temp = utilCreateString("%s..%ccontrols.cfg", _global.conf->dataDir, utilGetPathSeparator()); + if (utilFileExists(temp)) { + progTrace("Loading %s", temp); + if (luaL_dofile(_global.luaContext, temp)) utilDie("%s", lua_tostring(_global.luaContext, -1)); + } + free(temp); + // Load mappings in game data dir + temp = utilCreateString("%scontrols.cfg", _global.conf->dataDir); + if (utilFileExists(temp)) { + progTrace("Loading %s", temp); + if (luaL_dofile(_global.luaContext, temp)) utilDie("%s", lua_tostring(_global.luaContext, -1)); + } + free(temp); + // Load mappings in game script dir + temp = strdup(_global.conf->scriptFile); + temp2 = utilStrndup(temp, strlen(temp) - strlen(utilGetLastPathComponent(temp))); + free(temp); + temp = utilCreateString("%scontrols.cfg", temp2); + if (utilFileExists(temp)) { + progTrace("Loading %s", temp); + if (luaL_dofile(_global.luaContext, temp)) utilDie("%s", lua_tostring(_global.luaContext, -1)); + } + free(temp); + free(temp2); + // Parse results + lua_getglobal(_global.luaContext, "DEAD_ZONE"); + if (lua_isnumber(_global.luaContext, -1)) { + _global.controllerDeadZone = (int32_t)lua_tonumber(_global.luaContext, -1); + progTrace("Controller dead zone is %d", _global.controllerDeadZone); + } + lua_pop(_global.luaContext, 1); + for (x=0; x 0) { + _global.controlMappings[x].inputCount = y; + _global.controlMappings[x].input = (int32_t *)malloc(sizeof(int32_t) * y); + if (!_global.controlMappings[x].input) utilDie("Unable to allocate memory for control mappings."); + } + } else { + utilSay("Configuration option %s missing!", _global.controlMappings[x].name); + } + lua_pop(_global.luaContext, 1); + // Then load them for real. + lua_getglobal(_global.luaContext, _global.controlMappings[x].name); + if (lua_istable(_global.luaContext, -1)) { + y = 0; + lua_pushnil(_global.luaContext); + while (lua_next(_global.luaContext, -2)) { + if (lua_istable(_global.luaContext, -1)) { + lua_pushnil(_global.luaContext); + while (lua_next(_global.luaContext, -2)) { + if (lua_type(_global.luaContext, -2) == LUA_TSTRING) { + if (utilStricmp((char *)lua_tostring(_global.luaContext, -2), "value") == 0) { + _global.controlMappings[x].input[y++] = (int32_t)lua_tonumber(_global.luaContext, -1); + } + } + lua_pop(_global.luaContext, 1); + } + } + lua_pop(_global.luaContext, 1); + } + } + lua_pop(_global.luaContext, 1); + } + lua_close(_global.luaContext); - // Show splash screens - if (!_global.conf->noLogos) { - progTrace("Showing splash screens"); - doLogos(); - } + // Show splash screens + if (!_global.conf->noLogos) { + progTrace("Showing splash screens"); + doLogos(); + } - // Start Lua for game - progTrace("Creating Lua context for script"); - _global.luaContext = luaL_newstate(); - startLuaContext(_global.luaContext); + // Start Lua for game + progTrace("Creating Lua context for script"); + _global.luaContext = luaL_newstate(); + startLuaContext(_global.luaContext); - // Lua API for Singe - lua_register(_global.luaContext, "colorBackground", apiColorBackground); - lua_register(_global.luaContext, "colorForeground", apiColorForeground); + // Lua API for Singe + lua_register(_global.luaContext, "colorBackground", apiColorBackground); + lua_register(_global.luaContext, "colorForeground", apiColorForeground); - lua_register(_global.luaContext, "controllerGetAxis", apiControllerGetAxis); + lua_register(_global.luaContext, "controllerGetAxis", apiControllerGetAxis); - lua_register(_global.luaContext, "debugPrint", apiDebugPrint); + lua_register(_global.luaContext, "debugPrint", apiDebugPrint); - lua_register(_global.luaContext, "discAudio", apiDiscAudio); - lua_register(_global.luaContext, "discChangeSpeed", apiDiscChangeSpeed); - lua_register(_global.luaContext, "discGetFrame", apiDiscGetFrame); - lua_register(_global.luaContext, "discGetHeight", apiDiscGetHeight); - lua_register(_global.luaContext, "discGetState", apiDiscGetState); - lua_register(_global.luaContext, "discGetWidth", apiDiscGetWidth); - lua_register(_global.luaContext, "discPause", apiDiscPause); - lua_register(_global.luaContext, "discPauseAtFrame", apiDiscPauseAtFrame); - lua_register(_global.luaContext, "discPlay", apiDiscPlay); - lua_register(_global.luaContext, "discSearch", apiDiscSearch); - lua_register(_global.luaContext, "discSearchBlanking", apiDiscSearchBlanking); - lua_register(_global.luaContext, "discSetFPS", apiDiscSetFps); - lua_register(_global.luaContext, "discSkipBackward", apiDiscSkipBackward); - lua_register(_global.luaContext, "discSkipBlanking", apiDiscSkipBlanking); - lua_register(_global.luaContext, "discSkipForward", apiDiscSkipForward); - lua_register(_global.luaContext, "discSkipToFrame", apiDiscSkipToFrame); - lua_register(_global.luaContext, "discStepBackward", apiDiscStepBackward); - lua_register(_global.luaContext, "discStepForward", apiDiscStepForward); - lua_register(_global.luaContext, "discStop", apiDiscStop); + lua_register(_global.luaContext, "discAudio", apiDiscAudio); + lua_register(_global.luaContext, "discChangeSpeed", apiDiscChangeSpeed); + lua_register(_global.luaContext, "discGetFrame", apiDiscGetFrame); + lua_register(_global.luaContext, "discGetHeight", apiDiscGetHeight); + lua_register(_global.luaContext, "discGetState", apiDiscGetState); + lua_register(_global.luaContext, "discGetWidth", apiDiscGetWidth); + lua_register(_global.luaContext, "discPause", apiDiscPause); + lua_register(_global.luaContext, "discPauseAtFrame", apiDiscPauseAtFrame); + lua_register(_global.luaContext, "discPlay", apiDiscPlay); + lua_register(_global.luaContext, "discSearch", apiDiscSearch); + lua_register(_global.luaContext, "discSearchBlanking", apiDiscSearchBlanking); + lua_register(_global.luaContext, "discSetFPS", apiDiscSetFps); + lua_register(_global.luaContext, "discSkipBackward", apiDiscSkipBackward); + lua_register(_global.luaContext, "discSkipBlanking", apiDiscSkipBlanking); + lua_register(_global.luaContext, "discSkipForward", apiDiscSkipForward); + lua_register(_global.luaContext, "discSkipToFrame", apiDiscSkipToFrame); + lua_register(_global.luaContext, "discStepBackward", apiDiscStepBackward); + lua_register(_global.luaContext, "discStepForward", apiDiscStepForward); + lua_register(_global.luaContext, "discStop", apiDiscStop); - lua_register(_global.luaContext, "fontLoad", apiFontLoad); - lua_register(_global.luaContext, "fontPrint", apiFontPrint); - lua_register(_global.luaContext, "fontQuality", apiFontQuality); - lua_register(_global.luaContext, "fontSelect", apiFontSelect); - lua_register(_global.luaContext, "fontToSprite", apiFontToSprite); - lua_register(_global.luaContext, "fontUnload", apiFontUnload); + lua_register(_global.luaContext, "fontLoad", apiFontLoad); + lua_register(_global.luaContext, "fontPrint", apiFontPrint); + lua_register(_global.luaContext, "fontQuality", apiFontQuality); + lua_register(_global.luaContext, "fontSelect", apiFontSelect); + lua_register(_global.luaContext, "fontToSprite", apiFontToSprite); + lua_register(_global.luaContext, "fontUnload", apiFontUnload); - lua_register(_global.luaContext, "keyboardGetMode", apiKeyboardGetMode); - lua_register(_global.luaContext, "keyboardSetMode", apiKeyboardSetMode); + lua_register(_global.luaContext, "keyboardGetMode", apiKeyboardGetMode); + lua_register(_global.luaContext, "keyboardSetMode", apiKeyboardSetMode); - lua_register(_global.luaContext, "mouseEnable", apiMouseEnable); - lua_register(_global.luaContext, "mouseDisable", apiMouseDisable); - lua_register(_global.luaContext, "mouseGetPosition", apiMouseGetPosition); - lua_register(_global.luaContext, "mouseHowMany", apiMouseHowMany); - lua_register(_global.luaContext, "mouseSetCaptured", apiMouseSetCaptured); - lua_register(_global.luaContext, "mouseSetMode", apiMouseSetMode); + lua_register(_global.luaContext, "mouseEnable", apiMouseEnable); + lua_register(_global.luaContext, "mouseDisable", apiMouseDisable); + lua_register(_global.luaContext, "mouseGetPosition", apiMouseGetPosition); + lua_register(_global.luaContext, "mouseHowMany", apiMouseHowMany); + lua_register(_global.luaContext, "mouseSetCaptured", apiMouseSetCaptured); + lua_register(_global.luaContext, "mouseSetMode", apiMouseSetMode); - lua_register(_global.luaContext, "overlayBox", apiOverlayBox); - lua_register(_global.luaContext, "overlayCircle", apiOverlayCircle); - lua_register(_global.luaContext, "overlayClear", apiOverlayClear); - lua_register(_global.luaContext, "overlayEllipse", apiOverlayEllipse); - lua_register(_global.luaContext, "overlayGetHeight", apiOverlayGetHeight); - lua_register(_global.luaContext, "overlayGetWidth", apiOverlayGetWidth); - lua_register(_global.luaContext, "overlayLine", apiOverlayLine); - lua_register(_global.luaContext, "overlayPlot", apiOverlayPlot); - lua_register(_global.luaContext, "overlayPrint", apiOverlayPrint); - lua_register(_global.luaContext, "overlaySetResolution", apiOverlaySetResolution); + lua_register(_global.luaContext, "overlayBox", apiOverlayBox); + lua_register(_global.luaContext, "overlayCircle", apiOverlayCircle); + lua_register(_global.luaContext, "overlayClear", apiOverlayClear); + lua_register(_global.luaContext, "overlayEllipse", apiOverlayEllipse); + lua_register(_global.luaContext, "overlayGetHeight", apiOverlayGetHeight); + lua_register(_global.luaContext, "overlayGetWidth", apiOverlayGetWidth); + lua_register(_global.luaContext, "overlayLine", apiOverlayLine); + lua_register(_global.luaContext, "overlayPlot", apiOverlayPlot); + lua_register(_global.luaContext, "overlayPrint", apiOverlayPrint); + lua_register(_global.luaContext, "overlaySetResolution", apiOverlaySetResolution); - lua_register(_global.luaContext, "scriptExecute", apiScriptExecute); - lua_register(_global.luaContext, "scriptPush", apiScriptPush); + lua_register(_global.luaContext, "scriptExecute", apiScriptExecute); + lua_register(_global.luaContext, "scriptPush", apiScriptPush); - lua_register(_global.luaContext, "singeDisablePauseKey", apiSingeDisablePauseKey); - lua_register(_global.luaContext, "singeEnablePauseKey", apiSingeEnablePauseKey); - lua_register(_global.luaContext, "singeGetDataPath", apiSingeGetDataPath); - lua_register(_global.luaContext, "singeGetHeight", apiSingeGetHeight); - lua_register(_global.luaContext, "singeGetPauseFlag", apiSingeGetPauseFlag); - lua_register(_global.luaContext, "singeGetScriptPath", apiSingeGetScriptPath); - lua_register(_global.luaContext, "singeGetWidth", apiSingeGetWidth); - lua_register(_global.luaContext, "singeScreenshot", apiSingeScreenshot); - lua_register(_global.luaContext, "singeSetGameName", apiSingeSetGameName); - lua_register(_global.luaContext, "singeSetPauseFlag", apiSingeSetPauseFlag); - lua_register(_global.luaContext, "singeQuit", apiSingeQuit); - lua_register(_global.luaContext, "singeVersion", apiSingeVersion); - lua_register(_global.luaContext, "singeWantsCrosshairs", apiSingeWantsCrosshairs); + lua_register(_global.luaContext, "singeDisablePauseKey", apiSingeDisablePauseKey); + lua_register(_global.luaContext, "singeEnablePauseKey", apiSingeEnablePauseKey); + lua_register(_global.luaContext, "singeGetDataPath", apiSingeGetDataPath); + lua_register(_global.luaContext, "singeGetHeight", apiSingeGetHeight); + lua_register(_global.luaContext, "singeGetPauseFlag", apiSingeGetPauseFlag); + lua_register(_global.luaContext, "singeGetScriptPath", apiSingeGetScriptPath); + lua_register(_global.luaContext, "singeGetWidth", apiSingeGetWidth); + lua_register(_global.luaContext, "singeScreenshot", apiSingeScreenshot); + lua_register(_global.luaContext, "singeSetGameName", apiSingeSetGameName); + lua_register(_global.luaContext, "singeSetPauseFlag", apiSingeSetPauseFlag); + lua_register(_global.luaContext, "singeQuit", apiSingeQuit); + lua_register(_global.luaContext, "singeVersion", apiSingeVersion); + lua_register(_global.luaContext, "singeWantsCrosshairs", apiSingeWantsCrosshairs); - lua_register(_global.luaContext, "soundFullStop", apiSoundFullStop); - lua_register(_global.luaContext, "soundGetVolume", apiSoundGetVolume); - lua_register(_global.luaContext, "soundIsPlaying", apiSoundIsPlaying); - lua_register(_global.luaContext, "soundLoad", apiSoundLoad); - lua_register(_global.luaContext, "soundPause", apiSoundPause); - lua_register(_global.luaContext, "soundPlay", apiSoundPlay); - lua_register(_global.luaContext, "soundResume", apiSoundResume); - lua_register(_global.luaContext, "soundSetVolume", apiSoundSetVolume); - lua_register(_global.luaContext, "soundStop", apiSoundStop); - lua_register(_global.luaContext, "soundUnload", apiSoundUnload); + lua_register(_global.luaContext, "soundFullStop", apiSoundFullStop); + lua_register(_global.luaContext, "soundGetVolume", apiSoundGetVolume); + lua_register(_global.luaContext, "soundIsPlaying", apiSoundIsPlaying); + lua_register(_global.luaContext, "soundLoad", apiSoundLoad); + lua_register(_global.luaContext, "soundPause", apiSoundPause); + lua_register(_global.luaContext, "soundPlay", apiSoundPlay); + lua_register(_global.luaContext, "soundResume", apiSoundResume); + lua_register(_global.luaContext, "soundSetVolume", apiSoundSetVolume); + lua_register(_global.luaContext, "soundStop", apiSoundStop); + lua_register(_global.luaContext, "soundUnload", apiSoundUnload); - lua_register(_global.luaContext, "spriteDraw", apiSpriteDraw); - lua_register(_global.luaContext, "spriteGetHeight", apiSpriteGetHeight); - lua_register(_global.luaContext, "spriteGetWidth", apiSpriteGetWidth); - lua_register(_global.luaContext, "spriteLoad", apiSpriteLoad); - lua_register(_global.luaContext, "spriteUnload", apiSpriteUnload); + lua_register(_global.luaContext, "spriteDraw", apiSpriteDraw); + lua_register(_global.luaContext, "spriteGetHeight", apiSpriteGetHeight); + lua_register(_global.luaContext, "spriteGetWidth", apiSpriteGetWidth); + lua_register(_global.luaContext, "spriteLoad", apiSpriteLoad); + lua_register(_global.luaContext, "spriteUnload", apiSpriteUnload); - lua_register(_global.luaContext, "videoDraw", apiVideoDraw); - lua_register(_global.luaContext, "videoGetFrame", apiVideoGetFrame); - lua_register(_global.luaContext, "videoGetFrameCount", apiVideoGetFrameCount); - lua_register(_global.luaContext, "videoGetHeight", apiVideoGetHeight); - lua_register(_global.luaContext, "videoGetVolume", apiVideoGetVolume); - lua_register(_global.luaContext, "videoGetWidth", apiVideoGetWidth); - lua_register(_global.luaContext, "videoIsPlaying", apiVideoIsPlaying); - lua_register(_global.luaContext, "videoLoad", apiVideoLoad); - lua_register(_global.luaContext, "videoPause", apiVideoPause); - lua_register(_global.luaContext, "videoPlay", apiVideoPlay); - lua_register(_global.luaContext, "videoSeek", apiVideoSeek); - lua_register(_global.luaContext, "videoSetVolume", apiVideoSetVolume); - lua_register(_global.luaContext, "videoUnload", apiVideoUnload); + lua_register(_global.luaContext, "videoDraw", apiVideoDraw); + lua_register(_global.luaContext, "videoGetFrame", apiVideoGetFrame); + lua_register(_global.luaContext, "videoGetFrameCount", apiVideoGetFrameCount); + lua_register(_global.luaContext, "videoGetHeight", apiVideoGetHeight); + lua_register(_global.luaContext, "videoGetVolume", apiVideoGetVolume); + lua_register(_global.luaContext, "videoGetWidth", apiVideoGetWidth); + lua_register(_global.luaContext, "videoIsPlaying", apiVideoIsPlaying); + lua_register(_global.luaContext, "videoLoad", apiVideoLoad); + lua_register(_global.luaContext, "videoPause", apiVideoPause); + lua_register(_global.luaContext, "videoPlay", apiVideoPlay); + lua_register(_global.luaContext, "videoSeek", apiVideoSeek); + lua_register(_global.luaContext, "videoSetVolume", apiVideoSetVolume); + lua_register(_global.luaContext, "videoUnload", apiVideoUnload); - lua_register(_global.luaContext, "vldpGetHeight", apiVldpGetHeight); - lua_register(_global.luaContext, "vldpGetPixel", apiVldpGetPixel); - lua_register(_global.luaContext, "vldpGetWidth", apiVldpGetWidth); - lua_register(_global.luaContext, "vldpSetVerbose", apiVldpVerbose); + lua_register(_global.luaContext, "vldpGetHeight", apiVldpGetHeight); + lua_register(_global.luaContext, "vldpGetPixel", apiVldpGetPixel); + lua_register(_global.luaContext, "vldpGetWidth", apiVldpGetWidth); + lua_register(_global.luaContext, "vldpSetVerbose", apiVldpVerbose); - // Open main video file - progTrace("Opening main video file"); - doIndexDisplay(-1); - videoSetIndexCallback(doIndexDisplay); - if (_global.conf->isFrameFile) { - _global.frameFileHandle = frameFileLoad(_global.conf->videoFile, _global.conf->dataDir, (bool)_global.conf->stretchVideo, _global.renderer, _global.conf->showCalculated); - if (_global.frameFileHandle < 0) utilDie("Unable to load framefile: %s", _global.conf->videoFile); - frameFileSeek(_global.frameFileHandle, 0, &_global.videoHandle, &thisFrame); // Fills in _global.videoHandle - } else { - _global.videoHandle = videoLoad(_global.conf->videoFile, _global.conf->dataDir, (bool)_global.conf->stretchVideo, _global.renderer); - } - if (_global.videoHandle < 0) utilDie("Unable to load video file: %s", _global.conf->videoFile); - videoSetVolume(_global.videoHandle, _global.conf->volumeVldp, _global.conf->volumeVldp); - videoSetIndexCallback(NULL); - doIndexDisplay(-2); + // Open main video file + progTrace("Opening main video file"); + doIndexDisplay(-1); + videoSetIndexCallback(doIndexDisplay); + if (_global.conf->isFrameFile) { + _global.frameFileHandle = frameFileLoad(_global.conf->videoFile, _global.conf->dataDir, (bool)_global.conf->stretchVideo, _global.renderer, _global.conf->showCalculated); + if (_global.frameFileHandle < 0) utilDie("Unable to load framefile: %s", _global.conf->videoFile); + frameFileSeek(_global.frameFileHandle, 0, &_global.videoHandle, &thisFrame); // Fills in _global.videoHandle + } else { + _global.videoHandle = videoLoad(_global.conf->videoFile, _global.conf->dataDir, (bool)_global.conf->stretchVideo, _global.renderer); + } + if (_global.videoHandle < 0) utilDie("Unable to load video file: %s", _global.conf->videoFile); + videoSetVolume(_global.videoHandle, _global.conf->volumeVldp, _global.conf->volumeVldp); + videoSetIndexCallback(NULL); + doIndexDisplay(-2); - // Should we resize the window? - if (conf->resolutionWasCalculated && !conf->fullScreen && !conf->fullScreenWindow) { - // Is the video wider than the display window? - if ((videoGetWidth(_global.videoHandle) / videoGetHeight(_global.videoHandle)) > (conf->xResolution / conf->yResolution)) { - // Find new window height - conf->yResolution = ((float)conf->xResolution / (float)videoGetWidth(_global.videoHandle) * (float)videoGetHeight(_global.videoHandle)); - changed = true; - } else { - // Find new window width - conf->xResolution = ((float)conf->yResolution / (float)videoGetHeight(_global.videoHandle) * (float)videoGetWidth(_global.videoHandle)); - changed = true; - } - if (changed) { - progTrace("Resizing window to %dx%d based on main video file", conf->xResolution, conf->yResolution); - SDL_SetWindowSize(_global.window, conf->xResolution, conf->yResolution); - progTrace("Destroying old renderer"); - SDL_DestroyRenderer(_global.renderer); - // Recreate an accelerated renderer. - progTrace("Creating new renderer"); - _global.renderer = SDL_CreateRenderer(_global.window, -1, SDL_RENDERER_ACCELERATED); - if (_global.renderer == NULL) utilDie("%s", SDL_GetError()); - // Clear screen with black - SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); - SDL_RenderClear(_global.renderer); - changed = false; - } - } + // Should we resize the window? + if (conf->resolutionWasCalculated && !conf->fullScreen && !conf->fullScreenWindow) { + // Is the video wider than the display window? + if ((videoGetWidth(_global.videoHandle) / videoGetHeight(_global.videoHandle)) > (conf->xResolution / conf->yResolution)) { + // Find new window height + conf->yResolution = ((float)conf->xResolution / (float)videoGetWidth(_global.videoHandle) * (float)videoGetHeight(_global.videoHandle)); + changed = true; + } else { + // Find new window width + conf->xResolution = ((float)conf->yResolution / (float)videoGetHeight(_global.videoHandle) * (float)videoGetWidth(_global.videoHandle)); + changed = true; + } + if (changed) { + progTrace("Resizing window to %dx%d based on main video file", conf->xResolution, conf->yResolution); + SDL_SetWindowSize(_global.window, conf->xResolution, conf->yResolution); + progTrace("Destroying old renderer"); + SDL_DestroyRenderer(_global.renderer); + // Recreate an accelerated renderer. + progTrace("Creating new renderer"); + _global.renderer = SDL_CreateRenderer(_global.window, -1, SDL_RENDERER_ACCELERATED); + if (_global.renderer == NULL) utilDie("%s", SDL_GetError()); + // Clear screen with black + SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); + SDL_RenderClear(_global.renderer); + changed = false; + } + } - // Default render location is the entire window - windowTarget.x = 0; - windowTarget.y = 0; - windowTarget.w = videoGetWidth(_global.videoHandle); - windowTarget.h = videoGetHeight(_global.videoHandle); - sindenWhite.x = -1; - sindenBlack.x = -1; + // Default render location is the entire window + windowTarget.x = 0; + windowTarget.y = 0; + windowTarget.w = videoGetWidth(_global.videoHandle); + windowTarget.h = videoGetHeight(_global.videoHandle); + sindenWhite.x = -1; + sindenBlack.x = -1; - // Overscan compensation - if (_global.conf->scaleFactor < 100) { - windowTarget.w = videoGetWidth(_global.videoHandle) * _global.conf->scaleFactor / 100; - windowTarget.h = videoGetHeight(_global.videoHandle) * _global.conf->scaleFactor / 100; - windowTarget.x = (videoGetWidth(_global.videoHandle) - windowTarget.w) / 2; - windowTarget.y = (videoGetHeight(_global.videoHandle) - windowTarget.h) / 2; - } + // Overscan compensation + if (_global.conf->scaleFactor < 100) { + windowTarget.w = videoGetWidth(_global.videoHandle) * _global.conf->scaleFactor / 100; + windowTarget.h = videoGetHeight(_global.videoHandle) * _global.conf->scaleFactor / 100; + windowTarget.x = (videoGetWidth(_global.videoHandle) - windowTarget.w) / 2; + windowTarget.y = (videoGetHeight(_global.videoHandle) - windowTarget.h) / 2; + } - // Sinden Light Gun Border Setup - if (_global.conf->sindenArgc > 0) { - //***TODO*** ADD MOUSE SCALING TO COMPENSATE FOR BORDER - sindenWhiteColor.r = 255; - sindenWhiteColor.g = 255; - sindenWhiteColor.b = 255; - sindenWhiteColor.a = 255; - sindenBlackColor.r = 0; - sindenBlackColor.g = 0; - sindenBlackColor.b = 0; - sindenBlackColor.a = 255; - // Ok, this thing can have a mess of different arguments: - switch(_global.conf->sindenArgc) { - // WW - Just the width of the white border - case SINDEN_WHITE: - sindenWhite.x = _global.conf->sindenArgv[0]; - break; - // WW WB - Width of white border and then black border - case SINDEN_WHITE_BLACK: - sindenWhite.x = _global.conf->sindenArgv[0]; - sindenBlack.x = _global.conf->sindenArgv[1]; - break; - // RW GW BW WW - Custom color "white" border and width - case SINDEN_CUSTOM_WHITE: - sindenWhiteColor.r = _global.conf->sindenArgv[0]; - sindenWhiteColor.g = _global.conf->sindenArgv[1]; - sindenWhiteColor.b = _global.conf->sindenArgv[2]; - sindenWhite.x = _global.conf->sindenArgv[3]; - break; - // RW GW BW WW WB - Custom color "white" border and width then width of black border - case SINDEN_CUSTOM_WHITE_BLACK: - sindenWhiteColor.r = _global.conf->sindenArgv[0]; - sindenWhiteColor.g = _global.conf->sindenArgv[1]; - sindenWhiteColor.b = _global.conf->sindenArgv[2]; - sindenWhite.x = _global.conf->sindenArgv[3]; - sindenBlack.x = _global.conf->sindenArgv[4]; - break; - // RW GW BW WW RB GB BB WB - Custom color "white" border and width then custom color "black" border and width - case SINDEN_CUSTOM_WHITE_CUSTOM_BLACK: - sindenWhiteColor.r = _global.conf->sindenArgv[0]; - sindenWhiteColor.g = _global.conf->sindenArgv[1]; - sindenWhiteColor.b = _global.conf->sindenArgv[2]; - sindenWhite.x = _global.conf->sindenArgv[3]; - sindenBlackColor.r = _global.conf->sindenArgv[4]; - sindenBlackColor.g = _global.conf->sindenArgv[5]; - sindenBlackColor.b = _global.conf->sindenArgv[6]; - sindenBlack.x = _global.conf->sindenArgv[7]; - break; - } - if (sindenWhite.x >= 0) { - sindenWhite.y = sindenWhite.x; - sindenWhite.w = videoGetWidth(_global.videoHandle) - (sindenWhite.x * 2); - sindenWhite.h = videoGetHeight(_global.videoHandle) - (sindenWhite.y * 2); - } - if (sindenBlack.x >= 0) { - sindenBlack.y = sindenBlack.x; - sindenBlack.w = videoGetWidth(_global.videoHandle) - (sindenBlack.x * 2); - sindenBlack.h = videoGetHeight(_global.videoHandle) - (sindenBlack.y * 2); - sindenWhite.x += sindenBlack.x; - sindenWhite.y += sindenBlack.y; - sindenWhite.w -= (sindenBlack.x * 2); - sindenWhite.h -= (sindenBlack.y * 2); - } - windowTarget = sindenWhite; //***TODO*** We don't really need sindenWhite - } + // Sinden Light Gun Border Setup + if (_global.conf->sindenArgc > 0) { + //***TODO*** ADD MOUSE SCALING TO COMPENSATE FOR BORDER + sindenWhiteColor.r = 255; + sindenWhiteColor.g = 255; + sindenWhiteColor.b = 255; + sindenWhiteColor.a = 255; + sindenBlackColor.r = 0; + sindenBlackColor.g = 0; + sindenBlackColor.b = 0; + sindenBlackColor.a = 255; + // Ok, this thing can have a mess of different arguments: + switch(_global.conf->sindenArgc) { + // WW - Just the width of the white border + case SINDEN_WHITE: + sindenWhite.x = _global.conf->sindenArgv[0]; + break; + // WW WB - Width of white border and then black border + case SINDEN_WHITE_BLACK: + sindenWhite.x = _global.conf->sindenArgv[0]; + sindenBlack.x = _global.conf->sindenArgv[1]; + break; + // RW GW BW WW - Custom color "white" border and width + case SINDEN_CUSTOM_WHITE: + sindenWhiteColor.r = _global.conf->sindenArgv[0]; + sindenWhiteColor.g = _global.conf->sindenArgv[1]; + sindenWhiteColor.b = _global.conf->sindenArgv[2]; + sindenWhite.x = _global.conf->sindenArgv[3]; + break; + // RW GW BW WW WB - Custom color "white" border and width then width of black border + case SINDEN_CUSTOM_WHITE_BLACK: + sindenWhiteColor.r = _global.conf->sindenArgv[0]; + sindenWhiteColor.g = _global.conf->sindenArgv[1]; + sindenWhiteColor.b = _global.conf->sindenArgv[2]; + sindenWhite.x = _global.conf->sindenArgv[3]; + sindenBlack.x = _global.conf->sindenArgv[4]; + break; + // RW GW BW WW RB GB BB WB - Custom color "white" border and width then custom color "black" border and width + case SINDEN_CUSTOM_WHITE_CUSTOM_BLACK: + sindenWhiteColor.r = _global.conf->sindenArgv[0]; + sindenWhiteColor.g = _global.conf->sindenArgv[1]; + sindenWhiteColor.b = _global.conf->sindenArgv[2]; + sindenWhite.x = _global.conf->sindenArgv[3]; + sindenBlackColor.r = _global.conf->sindenArgv[4]; + sindenBlackColor.g = _global.conf->sindenArgv[5]; + sindenBlackColor.b = _global.conf->sindenArgv[6]; + sindenBlack.x = _global.conf->sindenArgv[7]; + break; + } + if (sindenWhite.x >= 0) { + sindenWhite.y = sindenWhite.x; + sindenWhite.w = videoGetWidth(_global.videoHandle) - (sindenWhite.x * 2); + sindenWhite.h = videoGetHeight(_global.videoHandle) - (sindenWhite.y * 2); + } + if (sindenBlack.x >= 0) { + sindenBlack.y = sindenBlack.x; + sindenBlack.w = videoGetWidth(_global.videoHandle) - (sindenBlack.x * 2); + sindenBlack.h = videoGetHeight(_global.videoHandle) - (sindenBlack.y * 2); + sindenWhite.x += sindenBlack.x; + sindenWhite.y += sindenBlack.y; + sindenWhite.w -= (sindenBlack.x * 2); + sindenWhite.h -= (sindenBlack.y * 2); + } + windowTarget = sindenWhite; //***TODO*** We don't really need sindenWhite + } - // Create overlay surface - _global.overlayScaleX = 0.5; - _global.overlayScaleY = 0.5; - x = (int32_t)(videoGetWidth(_global.videoHandle) * _global.overlayScaleX); - y = (int32_t)(videoGetHeight(_global.videoHandle) * _global.overlayScaleY); - progTrace("Creating overlay of %dx%d", x, y); - _global.overlay = SDL_CreateRGBSurfaceWithFormat(0, x, y, 32, SDL_PIXELFORMAT_BGRA32); - if (_global.overlay == NULL) utilDie("%s", SDL_GetError()); - SDL_SetSurfaceBlendMode(_global.overlay, SDL_BLENDMODE_BLEND); + // Create overlay surface + _global.overlayScaleX = 0.5; + _global.overlayScaleY = 0.5; + x = (int32_t)(videoGetWidth(_global.videoHandle) * _global.overlayScaleX); + y = (int32_t)(videoGetHeight(_global.videoHandle) * _global.overlayScaleY); + progTrace("Creating overlay of %dx%d", x, y); + _global.overlay = SDL_CreateRGBSurfaceWithFormat(0, x, y, 32, SDL_PIXELFORMAT_BGRA32); + if (_global.overlay == NULL) utilDie("%s", SDL_GetError()); + SDL_SetSurfaceBlendMode(_global.overlay, SDL_BLENDMODE_BLEND); - // Mouse setup - _global.mouseEnabled = (bool)!_global.conf->noMouse; - progTrace("Initializing ManyMouse"); - _global.mouseCount = ManyMouse_Init(); - progTrace("Mouse Driver: %s", ManyMouse_DriverName()); - progTrace("Mice Found: %d", _global.mouseCount); - if ((_global.mouseCount < 1) && _global.mouseEnabled) utilDie("No mice detected."); - if (_global.mouseCount > MAX_MICE) { - _global.mouseCount = MAX_MICE; - } - memset(_global.mice, 0, sizeof(_global.mice)); - for (x=0; x<_global.mouseCount; x++) { - strncpy(_global.mice[x].name, ManyMouse_DeviceName((unsigned)x), sizeof(_global.mice[x].name)); - _global.mice[x].name[sizeof(_global.mice[x].name) - 1] = 0; - _global.mice[x].x = (int32_t)(videoGetWidth(_global.videoHandle) * _global.overlayScaleX); - _global.mice[x].y = (int32_t)(videoGetHeight(_global.videoHandle) * _global.overlayScaleY); - progTrace("Mouse %d: %s", x, _global.mice[x].name); - } + // Mouse setup + _global.mouseEnabled = (bool)!_global.conf->noMouse; + progTrace("Initializing ManyMouse"); + _global.mouseCount = ManyMouse_Init(); + progTrace("Mouse Driver: %s", ManyMouse_DriverName()); + progTrace("Mice Found: %d", _global.mouseCount); + if ((_global.mouseCount < 1) && _global.mouseEnabled) utilDie("No mice detected."); + if (_global.mouseCount > MAX_MICE) { + _global.mouseCount = MAX_MICE; + } + memset(_global.mice, 0, sizeof(_global.mice)); + for (x=0; x<_global.mouseCount; x++) { + strncpy(_global.mice[x].name, ManyMouse_DeviceName((unsigned)x), sizeof(_global.mice[x].name)); + _global.mice[x].name[sizeof(_global.mice[x].name) - 1] = 0; + _global.mice[x].x = (int32_t)(videoGetWidth(_global.videoHandle) * _global.overlayScaleX); + _global.mice[x].y = (int32_t)(videoGetHeight(_global.videoHandle) * _global.overlayScaleY); + progTrace("Mouse %d: %s", x, _global.mice[x].name); + } - // Grab mouse - progTrace("Grabbing mouse"); - _global.mouseGrabbed = true; - SDL_SetWindowGrab(_global.window, SDL_TRUE); - progTrace("Disabling mouse pointer"); - SDL_ShowCursor(SDL_DISABLE); + // Grab mouse + progTrace("Grabbing mouse"); + _global.mouseGrabbed = true; + SDL_SetWindowGrab(_global.window, SDL_TRUE); + progTrace("Disabling mouse pointer"); + SDL_ShowCursor(SDL_DISABLE); - // Clear axis caches - for (x=0; xvolumeNonVldp * (float)0.01); - progTrace("Setting up sound effects mixer"); - Mix_Volume(-1, _global.effectsVolume * 2); + // Set volume + _global.effectsVolume = (int32_t)((float)AUDIO_MAX_VOLUME * (float)_global.conf->volumeNonVldp * (float)0.01); + progTrace("Setting up sound effects mixer"); + Mix_Volume(-1, _global.effectsVolume * 2); - // Let us know when sounds end - Mix_ChannelFinished(channelFinished); + // Let us know when sounds end + Mix_ChannelFinished(channelFinished); - // Load overlay font - progTrace("Loading console font"); - _global.consoleFontSurface = IMG_LoadPNG_RW(SDL_RWFromMem(font_png, font_png_len)); - if (_global.consoleFontSurface == NULL) utilDie("%s", SDL_GetError()); - _global.consoleFontWidth = _global.consoleFontSurface->w / 256; - _global.consoleFontHeight = _global.consoleFontSurface->h; - SDL_SetColorKey(_global.consoleFontSurface, true, _global.consoleFontSurface->format->Rmask | _global.consoleFontSurface->format->Bmask); + // Load overlay font + progTrace("Loading console font"); + _global.consoleFontSurface = IMG_LoadPNG_RW(SDL_RWFromMem(font_png, font_png_len)); + if (_global.consoleFontSurface == NULL) utilDie("%s", SDL_GetError()); + _global.consoleFontWidth = _global.consoleFontSurface->w / 256; + _global.consoleFontHeight = _global.consoleFontSurface->h; + SDL_SetColorKey(_global.consoleFontSurface, true, _global.consoleFontSurface->format->Rmask | _global.consoleFontSurface->format->Bmask); - // Start video - progTrace("Starting laserdisc video in stopped state"); - videoPlay(_global.videoHandle); - _global.discStopped = false; + // Start video + progTrace("Starting laserdisc video in stopped state"); + videoPlay(_global.videoHandle); + _global.discStopped = false; - // Start script - progTrace("Compiling %s", _global.conf->scriptFile); - if (luaL_dofile(_global.luaContext, _global.conf->scriptFile) != 0) utilDie("Error compiling script: %s", lua_tostring(_global.luaContext, -1)); + // Start script + progTrace("Compiling %s", _global.conf->scriptFile); + if (luaL_dofile(_global.luaContext, _global.conf->scriptFile) != 0) utilDie("Error compiling script: %s", lua_tostring(_global.luaContext, -1)); - // Game Loop - progTrace("Script is running"); - while (_global.running) { + // Game Loop + progTrace("Script is running"); + while (_global.running) { - // SDL Event Loop - while (SDL_PollEvent(&event)) { - switch (event.type) { - case SDL_CONTROLLERAXISMOTION: - axisIndex = event.caxis.which * 2 + event.caxis.axis; - // Is this in a range we care about? - if (abs(event.caxis.value) > _global.controllerDeadZone) { - // Determine which "scancode" to process - see Framework.singe - // Controller codes begin at 500 and increment in 100 - x = event.caxis.which * 100 + 500; - // The axis value lines up with the enumeration used by SDL * 3 - x += event.caxis.axis * 3; - // Finally we add the particular direction we're interested in - x += (event.caxis.value < 0) ? 1 : 2; - // Fire the down/up events for the axis direction - if (lastAnalogDirection[axisIndex] != AXIS_KEY_DOWN) { - processKey(true, 0, x); - lastAnalogDirection[axisIndex] = AXIS_KEY_DOWN; - } - } else { - // Handle "up" events for controller inside dead zone - if (lastAnalogDirection[axisIndex] != AXIS_KEY_UP) { - processKey(false, 0, x); - lastAnalogDirection[axisIndex] = AXIS_KEY_UP; - } - } - // Remember this change - _global.axisCache[axisIndex] = event.caxis.value; - // Fire analog event - callLua("onControllerMoved", "iii", event.caxis.axis, event.caxis.value, event.caxis.which); - break; + // SDL Event Loop + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_CONTROLLERAXISMOTION: + axisIndex = event.caxis.which * 2 + event.caxis.axis; + // Is this in a range we care about? + if (abs(event.caxis.value) > _global.controllerDeadZone) { + // Determine which "scancode" to process - see Framework.singe + // Controller codes begin at 500 and increment in 100 + x = event.caxis.which * 100 + 500; + // The axis value lines up with the enumeration used by SDL * 3 + x += event.caxis.axis * 3; + // Finally we add the particular direction we're interested in + x += (event.caxis.value < 0) ? 1 : 2; + // Fire the down/up events for the axis direction + if (lastAnalogDirection[axisIndex] != AXIS_KEY_DOWN) { + processKey(true, 0, x); + lastAnalogDirection[axisIndex] = AXIS_KEY_DOWN; + } + } else { + // Handle "up" events for controller inside dead zone + if (lastAnalogDirection[axisIndex] != AXIS_KEY_UP) { + processKey(false, 0, x); + lastAnalogDirection[axisIndex] = AXIS_KEY_UP; + } + } + // Remember this change + _global.axisCache[axisIndex] = event.caxis.value; + // Fire analog event + callLua("onControllerMoved", "iii", event.caxis.axis, event.caxis.value, event.caxis.which); + break; - case SDL_CONTROLLERBUTTONDOWN: - case SDL_CONTROLLERBUTTONUP: - // Determine which "scancode" to process - see Framework.singe - // Controller codes begin at 500 and increment in 100 - x = event.cbutton.which * 100 + 500; - // The button values line up with the enumeration used by SDL + 18 - x += event.cbutton.button + 18; - // Fire down event - processKey((event.type == SDL_CONTROLLERBUTTONDOWN) ? true : false, 0, x); - break; + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + // Determine which "scancode" to process - see Framework.singe + // Controller codes begin at 500 and increment in 100 + x = event.cbutton.which * 100 + 500; + // The button values line up with the enumeration used by SDL + 18 + x += event.cbutton.button + 18; + // Fire down event + processKey((event.type == SDL_CONTROLLERBUTTONDOWN) ? true : false, 0, x); + break; - case SDL_CONTROLLERDEVICEADDED: - case SDL_CONTROLLERDEVICEREMOVED: - progTrace("Updating connected controllers list"); - stopControllers(); - startControllers(); - break; + case SDL_CONTROLLERDEVICEADDED: + case SDL_CONTROLLERDEVICEREMOVED: + progTrace("Updating connected controllers list"); + stopControllers(); + startControllers(); + break; - case SDL_KEYDOWN: - case SDL_KEYUP: - processKey((event.type == SDL_KEYDOWN) ? true : false, event.key.keysym.sym, event.key.keysym.scancode); - break; + case SDL_KEYDOWN: + case SDL_KEYUP: + processKey((event.type == SDL_KEYDOWN) ? true : false, event.key.keysym.sym, event.key.keysym.scancode); + break; - case SDL_MOUSEMOTION: - if ((_global.mouseEnabled) && (_global.mouseMode == MOUSE_SINGLE)) { - x = (int32_t)(event.motion.x * _global.overlayScaleX); - y = (int32_t)(event.motion.y * _global.overlayScaleY); - xr = (int32_t)(event.motion.xrel * _global.overlayScaleX); - yr = (int32_t)(event.motion.yrel * _global.overlayScaleY); - // Remember this change - _global.axisCache[MAX_CONTROLLERS * 2] = x; - _global.axisCache[MAX_CONTROLLERS * 2 + 1] = y; - // Fire event - callLua("onMouseMoved", "iiiii", x, y, xr, yr, 0); - } - break; + case SDL_MOUSEMOTION: + if ((_global.mouseEnabled) && (_global.mouseMode == MOUSE_SINGLE)) { + x = (int32_t)(event.motion.x * _global.overlayScaleX); + y = (int32_t)(event.motion.y * _global.overlayScaleY); + xr = (int32_t)(event.motion.xrel * _global.overlayScaleX); + yr = (int32_t)(event.motion.yrel * _global.overlayScaleY); + // Remember this change + _global.axisCache[MAX_CONTROLLERS * 2] = x; + _global.axisCache[MAX_CONTROLLERS * 2 + 1] = y; + // Fire event + callLua("onMouseMoved", "iiiii", x, y, xr, yr, 0); + } + break; - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - if ((_global.mouseEnabled) && (_global.mouseMode == MOUSE_SINGLE)) { - // Mouse events start at "scancode" 1000 - x = 1000; - // SDL maps buttons L,M,R,X1,X2 starting at 1 - switch (event.button.button) { - case 2: - y = 2; - break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + if ((_global.mouseEnabled) && (_global.mouseMode == MOUSE_SINGLE)) { + // Mouse events start at "scancode" 1000 + x = 1000; + // SDL maps buttons L,M,R,X1,X2 starting at 1 + switch (event.button.button) { + case 2: + y = 2; + break; - case 3: - y = 1; - break; + case 3: + y = 1; + break; - default: - y = event.button.button - 1; - break; - } - x += y; - // Fire event - processKey((event.type == SDL_MOUSEBUTTONDOWN) ? true : false, 0, x); - } - break; + default: + y = event.button.button - 1; + break; + } + x += y; + // Fire event + processKey((event.type == SDL_MOUSEBUTTONDOWN) ? true : false, 0, x); + } + break; - case SDL_MOUSEWHEEL: - if ((_global.mouseEnabled) && (_global.mouseMode == MOUSE_SINGLE)) { - // Mouse events start at "scancode" 1000 - x = 1000; - // Scroll events start at 1005 and are mapped UP then DOWN - x += 5 + (event.wheel.y > 0 ? 0 : 1); - // Fire events - processKey(true, 0, x); - processKey(false, 0, x); - } - break; + case SDL_MOUSEWHEEL: + if ((_global.mouseEnabled) && (_global.mouseMode == MOUSE_SINGLE)) { + // Mouse events start at "scancode" 1000 + x = 1000; + // Scroll events start at 1005 and are mapped UP then DOWN + x += 5 + (event.wheel.y > 0 ? 0 : 1); + // Fire events + processKey(true, 0, x); + processKey(false, 0, x); + } + break; - case SDL_QUIT: - progTrace("Quit requested"); - _global.running = 0; - break; - } + case SDL_QUIT: + progTrace("Quit requested"); + _global.running = 0; + break; + } - // Mouse Event Loop - while (ManyMouse_PollEvent(&mouseEvent)) { + // Mouse Event Loop + while (ManyMouse_PollEvent(&mouseEvent)) { - // Just run out the event queue if we're not using ManyMouse - if ((!_global.mouseEnabled) || (_global.mouseMode == MOUSE_SINGLE)) continue; + // Just run out the event queue if we're not using ManyMouse + if ((!_global.mouseEnabled) || (_global.mouseMode == MOUSE_SINGLE)) continue; - // Has this one been unplugged? - if (mouseEvent.device >= (unsigned)_global.mouseCount) continue; - mouse = &_global.mice[mouseEvent.device]; + // Has this one been unplugged? + if (mouseEvent.device >= (unsigned)_global.mouseCount) continue; + mouse = &_global.mice[mouseEvent.device]; - switch (mouseEvent.type) { - case MANYMOUSE_EVENT_RELMOTION: - switch (mouseEvent.item) { - case 0: - mouse->relx += mouseEvent.value; - break; + switch (mouseEvent.type) { + case MANYMOUSE_EVENT_RELMOTION: + switch (mouseEvent.item) { + case 0: + mouse->relx += mouseEvent.value; + break; - case 1: - mouse->rely += mouseEvent.value; - break; - } - // Clamp to video size - x = videoGetWidth(_global.videoHandle); - y = videoGetHeight(_global.videoHandle); - if (mouse->relx < 0) mouse->relx = 0; - if (mouse->relx >= x) mouse->relx = x - 1; - if (mouse->rely < 0) mouse->rely = 0; - if (mouse->rely >= y) mouse->rely = y - 1; - x = (int32_t)(mouse->x * _global.overlayScaleX); - y = (int32_t)(mouse->y * _global.overlayScaleY); - xr = (int32_t)(mouse->relx * _global.overlayScaleX); - yr = (int32_t)(mouse->rely * _global.overlayScaleY); - //utilSay("ManyMouse %d: Relative %dx%d r=%dx%d", mouseEvent.device, x, y, xr, yr); - // Remember this change - _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2] = xr; - _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2 + 1] = yr; - // Fire event - //callLua("onMouseMoved", "iiiii", x, y, xr, yr, mouseEvent.device); - // We return relative coords for all parameters since we have no actual X & Y - callLua("onMouseMoved", "iiiii", xr, yr, xr, yr, mouseEvent.device); - break; + case 1: + mouse->rely += mouseEvent.value; + break; + } + // Clamp to video size + x = videoGetWidth(_global.videoHandle); + y = videoGetHeight(_global.videoHandle); + if (mouse->relx < 0) mouse->relx = 0; + if (mouse->relx >= x) mouse->relx = x - 1; + if (mouse->rely < 0) mouse->rely = 0; + if (mouse->rely >= y) mouse->rely = y - 1; + x = (int32_t)(mouse->x * _global.overlayScaleX); + y = (int32_t)(mouse->y * _global.overlayScaleY); + xr = (int32_t)(mouse->relx * _global.overlayScaleX); + yr = (int32_t)(mouse->rely * _global.overlayScaleY); + //utilSay("ManyMouse %d: Relative %dx%d r=%dx%d", mouseEvent.device, x, y, xr, yr); + // Remember this change + _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2] = xr; + _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2 + 1] = yr; + // Fire event + //callLua("onMouseMoved", "iiiii", x, y, xr, yr, mouseEvent.device); + // We return relative coords for all parameters since we have no actual X & Y + callLua("onMouseMoved", "iiiii", xr, yr, xr, yr, mouseEvent.device); + break; - //***TODO*** Doesn't ever seem used? -/* - case MANYMOUSE_EVENT_ABSMOTION: - val = (float)(mouseEvent.value - mouseEvent.minval); - maxval = (float)(mouseEvent.maxval - mouseEvent.minval); - switch (mouseEvent.item) { - case 0: - mouse->x = (val / maxval) * videoGetWidth(_global.videoHandle); - //mouse->x += mouseEvent.value; - break; + //***TODO*** Doesn't ever seem used? + case MANYMOUSE_EVENT_ABSMOTION: + /* + val = (float)(mouseEvent.value - mouseEvent.minval); + maxval = (float)(mouseEvent.maxval - mouseEvent.minval); + switch (mouseEvent.item) { + case 0: + mouse->x = (val / maxval) * videoGetWidth(_global.videoHandle); + //mouse->x += mouseEvent.value; + break; - case 1: - mouse->y = (val / maxval) * videoGetHeight(_global.videoHandle); - //mouse->y += mouseEvent.value; - break; - } - x = (int32_t)(mouse->x * _global.overlayScaleX); - y = (int32_t)(mouse->y * _global.overlayScaleY); - xr = (int32_t)(mouse->relx * _global.overlayScaleX); - yr = (int32_t)(mouse->rely * _global.overlayScaleY); - //utilSay("ManyMouse %d: Absolute %dx%d r=%dx%d", mouseEvent.device, x, y, xr, yr); - // Remember this change - _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2] = x; - _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2 + 1] = y; - // Fire event - callLua("onMouseMoved", "iiiii", x, y, xr, yr, mouseEvent.device); - break; + case 1: + mouse->y = (val / maxval) * videoGetHeight(_global.videoHandle); + //mouse->y += mouseEvent.value; + break; + } + x = (int32_t)(mouse->x * _global.overlayScaleX); + y = (int32_t)(mouse->y * _global.overlayScaleY); + xr = (int32_t)(mouse->relx * _global.overlayScaleX); + yr = (int32_t)(mouse->rely * _global.overlayScaleY); + //utilSay("ManyMouse %d: Absolute %dx%d r=%dx%d", mouseEvent.device, x, y, xr, yr); + // Remember this change + _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2] = x; + _global.axisCache[MAX_CONTROLLERS * 2 + mouseEvent.device * 2 + 1] = y; + // Fire event + callLua("onMouseMoved", "iiiii", x, y, xr, yr, mouseEvent.device); */ - case MANYMOUSE_EVENT_BUTTON: - if (mouseEvent.item < 5 /* 32 */) { // Limited to 5 buttons so it matches single-mouse mode - //utilSay("ManyMouse %d Button: %d", mouseEvent.device, mouseEvent.item); - // Mouse events start at "scancode" 1000 with 100 spacing - x = mouseEvent.device * 100 + 1000; - // ManyMouse maps buttons L,R,M,X1,X2 starting at 0 - x += mouseEvent.item; - if (mouseEvent.value == 1) { - // Button pressed - processKey(true, 0, x); - mouse->buttons |= (1 << mouseEvent.item); - } else { - // Button released - processKey(false, 0, x); - mouse->buttons &= ~(1 << mouseEvent.item); - } - } - break; + progTrace("Unimplemented MANYMOUSE_EVENT_ABSMOTION called"); + break; - case MANYMOUSE_EVENT_SCROLL: - if (mouseEvent.item == 0) { - // Mouse events start at "scancode" 1000 with 100 spacing - x = mouseEvent.device * 100 + 1000; - // Scroll events start at 1005 and are mapped UP then DOWN - x += 5 + (mouseEvent.value > 0 ? 0 : 1); - // Fire events - processKey(true, 0, x); - processKey(false, 0, x); - } - break; + case MANYMOUSE_EVENT_BUTTON: + if (mouseEvent.item < 5 /* 32 */) { // Limited to 5 buttons so it matches single-mouse mode + //utilSay("ManyMouse %d Button: %d", mouseEvent.device, mouseEvent.item); + // Mouse events start at "scancode" 1000 with 100 spacing + x = mouseEvent.device * 100 + 1000; + // ManyMouse maps buttons L,R,M,X1,X2 starting at 0 + x += mouseEvent.item; + if (mouseEvent.value == 1) { + // Button pressed + processKey(true, 0, x); + mouse->buttons |= (1 << mouseEvent.item); + } else { + // Button released + processKey(false, 0, x); + mouse->buttons &= ~(1 << mouseEvent.item); + } + } + break; - case MANYMOUSE_EVENT_DISCONNECT: - mouse->connected = false; - break; + case MANYMOUSE_EVENT_SCROLL: + if (mouseEvent.item == 0) { + // Mouse events start at "scancode" 1000 with 100 spacing + x = mouseEvent.device * 100 + 1000; + // Scroll events start at 1005 and are mapped UP then DOWN + x += 5 + (mouseEvent.value > 0 ? 0 : 1); + // Fire events + processKey(true, 0, x); + processKey(false, 0, x); + } + break; - case MANYMOUSE_EVENT_MAX: - // We don't use this - break; - } - } - } + case MANYMOUSE_EVENT_DISCONNECT: + mouse->connected = false; + break; - // Update video - thisFrame = videoUpdate(_global.videoHandle, &_global.videoTexture); - if (_global.conf->isFrameFile) { - frameFileUpdate(_global.frameFileHandle, &_global.videoHandle); - } - // Did we get a new video frame? - if ((thisFrame != lastFrame) && (thisFrame >= 0)) { - lastFrame = thisFrame; - frameClock = 0; - _global.refreshDisplay = true; - } + case MANYMOUSE_EVENT_MAX: + // We don't use this + break; + } + } + } - // Call game code - if (SDL_GetTicks() > frameClock) { - callLua("onOverlayUpdate", ">i", &intReturn); - if (intReturn == 1) { - _global.refreshDisplay = true; - } - frameClock = SDL_GetTicks() + 15; // Don't eat all the CPU. - } + // Update video + thisFrame = videoUpdate(_global.videoHandle, &_global.videoTexture); + if (_global.conf->isFrameFile) { + frameFileUpdate(_global.frameFileHandle, &_global.videoHandle); + } + // Did we get a new video frame? + if ((thisFrame != lastFrame) && (thisFrame >= 0)) { + lastFrame = thisFrame; + frameClock = 0; + _global.refreshDisplay = true; + } - // Update display - if (_global.refreshDisplay || _global.discStopped) { - // Clear entire display to black - SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); - SDL_RenderClear(_global.renderer); - // Sinden Gun Border - if (sindenWhite.x >= 0) { - if (sindenBlack.x >= 0) { - // Black and White - SDL_SetRenderDrawColor(_global.renderer, sindenBlackColor.r, sindenBlackColor.g, sindenBlackColor.b, sindenBlackColor.a); - SDL_RenderClear(_global.renderer); - SDL_SetRenderDrawColor(_global.renderer, sindenWhiteColor.r, sindenWhiteColor.g, sindenWhiteColor.b, sindenWhiteColor.a); - SDL_RenderFillRect(_global.renderer, &sindenBlack); - } else { - // Only white - SDL_SetRenderDrawColor(_global.renderer, sindenWhiteColor.r, sindenWhiteColor.g, sindenWhiteColor.b, sindenWhiteColor.a); - SDL_RenderFillRect(_global.renderer, &sindenBlack); - //SDL_RenderClear(_global.renderer); - } - //SDL_RenderFillRect(_global.renderer, &windowTarget); - } - // Laserdisc Video - if (_global.discStopped) { - // Stopped discs display blue like the good old days - SDL_SetRenderTarget(_global.renderer, _global.videoTexture); - SDL_SetRenderDrawColor(_global.renderer, 0, 0, 255, 255); - SDL_RenderFillRect(_global.renderer, &windowTarget); - SDL_SetRenderTarget(_global.renderer, NULL); - } - // Copy current video frame into display - SDL_RenderCopy(_global.renderer, _global.videoTexture, NULL, &windowTarget); - // Overlay - overlayTexture = SDL_CreateTextureFromSurface(_global.renderer, _global.overlay); - if (!overlayTexture) utilDie("%s", SDL_GetError()); - if (!_global.conf->stretchVideo) { - SDL_RenderSetLogicalSize(renderer, videoGetWidth(_global.videoHandle), videoGetHeight(_global.videoHandle)); - } - SDL_RenderCopy(_global.renderer, overlayTexture, NULL, &windowTarget); - SDL_DestroyTexture(overlayTexture); - overlayTexture = NULL; - // Show it - SDL_RenderPresent(_global.renderer); - _global.refreshDisplay = false; - // Save it? - if (_global.requestScreenShot) { - _global.requestScreenShot = false; - progTrace("Taking screenshot"); - takeScreenshot(); - } - } + // Call game code + if (SDL_GetTicks() > frameClock) { + callLua("onOverlayUpdate", ">i", &intReturn); + if (intReturn == 1) { + _global.refreshDisplay = true; + } + frameClock = SDL_GetTicks() + 15; // Don't eat all the CPU. + } - SDL_Delay(1); - } + // Update display + if (_global.refreshDisplay || _global.discStopped) { + // Clear entire display to black + SDL_SetRenderDrawColor(_global.renderer, 0, 0, 0, 255); + SDL_RenderClear(_global.renderer); + // Sinden Gun Border + if (sindenWhite.x >= 0) { + if (sindenBlack.x >= 0) { + // Black and White + SDL_SetRenderDrawColor(_global.renderer, sindenBlackColor.r, sindenBlackColor.g, sindenBlackColor.b, sindenBlackColor.a); + SDL_RenderClear(_global.renderer); + SDL_SetRenderDrawColor(_global.renderer, sindenWhiteColor.r, sindenWhiteColor.g, sindenWhiteColor.b, sindenWhiteColor.a); + SDL_RenderFillRect(_global.renderer, &sindenBlack); + } else { + // Only white + SDL_SetRenderDrawColor(_global.renderer, sindenWhiteColor.r, sindenWhiteColor.g, sindenWhiteColor.b, sindenWhiteColor.a); + SDL_RenderFillRect(_global.renderer, &sindenBlack); + //SDL_RenderClear(_global.renderer); + } + //SDL_RenderFillRect(_global.renderer, &windowTarget); + } + // Laserdisc Video + if (_global.discStopped) { + // Stopped discs display blue like the good old days + SDL_SetRenderTarget(_global.renderer, _global.videoTexture); + SDL_SetRenderDrawColor(_global.renderer, 0, 0, 255, 255); + SDL_RenderFillRect(_global.renderer, &windowTarget); + SDL_SetRenderTarget(_global.renderer, NULL); + } + // Copy current video frame into display + SDL_RenderCopy(_global.renderer, _global.videoTexture, NULL, &windowTarget); + // Overlay + overlayTexture = SDL_CreateTextureFromSurface(_global.renderer, _global.overlay); + if (!overlayTexture) utilDie("%s", SDL_GetError()); + if (!_global.conf->stretchVideo) { + SDL_RenderSetLogicalSize(renderer, videoGetWidth(_global.videoHandle), videoGetHeight(_global.videoHandle)); + } + SDL_RenderCopy(_global.renderer, overlayTexture, NULL, &windowTarget); + SDL_DestroyTexture(overlayTexture); + overlayTexture = NULL; + // Show it + SDL_RenderPresent(_global.renderer); + _global.refreshDisplay = false; + // Save it? + if (_global.requestScreenShot) { + _global.requestScreenShot = false; + progTrace("Taking screenshot"); + takeScreenshot(); + } + } - // End game - progTrace("Script is shutting down"); - callLua("onShutdown", ""); + SDL_Delay(1); + } - // Stop all sounds - progTrace("Stopping all audio"); - Mix_HaltChannel(-1); - Mix_ChannelFinished(NULL); + // End game + progTrace("Script is shutting down"); + callLua("onShutdown", ""); - // Stop Lua - progTrace("Stopping Lua"); - lua_close(_global.luaContext); + // Stop all sounds + progTrace("Stopping all audio"); + Mix_HaltChannel(-1); + Mix_ChannelFinished(NULL); - // Free overlay & overlay font - progTrace("Destroying overlay"); - SDL_FreeSurface(_global.overlay); - progTrace("Destroying console font"); - SDL_FreeSurface(_global.consoleFontSurface); + // Stop Lua + progTrace("Stopping Lua"); + lua_close(_global.luaContext); - // Unload fonts - HASH_ITER(hh, _global.fontList, font, fontTemp) { + // Free overlay & overlay font + progTrace("Destroying overlay"); + SDL_FreeSurface(_global.overlay); + progTrace("Destroying console font"); + SDL_FreeSurface(_global.consoleFontSurface); + + // Unload fonts + HASH_ITER(hh, _global.fontList, font, fontTemp) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" - HASH_DEL(_global.fontList, font); + HASH_DEL(_global.fontList, font); #pragma GCC diagnostic pop - progTrace("Unloading font handle %d", font->id); - TTF_CloseFont(font->font); - free(font); - } + progTrace("Unloading font handle %d", font->id); + TTF_CloseFont(font->font); + free(font); + } - // Unload sounds - HASH_ITER(hh, _global.soundList, sound, soundTemp) { + // Unload sounds + HASH_ITER(hh, _global.soundList, sound, soundTemp) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" - HASH_DEL(_global.soundList, sound); + HASH_DEL(_global.soundList, sound); #pragma GCC diagnostic pop - progTrace("Unloading sound handle %d", sound->id); - Mix_FreeChunk(sound->chunk); - free(sound); - } + progTrace("Unloading sound handle %d", sound->id); + Mix_FreeChunk(sound->chunk); + free(sound); + } - // Unload sprites - HASH_ITER(hh, _global.spriteList, sprite, spriteTemp) { + // Unload sprites + HASH_ITER(hh, _global.spriteList, sprite, spriteTemp) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-align" - HASH_DEL(_global.spriteList, sprite); + HASH_DEL(_global.spriteList, sprite); #pragma GCC diagnostic pop - progTrace("Unloading sprite handle %d", sprite->id); - SDL_FreeSurface(sprite->surface); - free(sprite); - } + progTrace("Unloading sprite handle %d", sprite->id); + SDL_FreeSurface(sprite->surface); + free(sprite); + } - // Unload videos - HASH_ITER(hh, _global.videoList, video, videoTemp) { - HASH_DEL(_global.videoList, video); - progTrace("Unloading video handle %d", video->id); - if (video->surface) SDL_FreeSurface(video->surface); - free(video); - } + // Unload videos + HASH_ITER(hh, _global.videoList, video, videoTemp) { + HASH_DEL(_global.videoList, video); + progTrace("Unloading video handle %d", video->id); + if (video->surface) SDL_FreeSurface(video->surface); + free(video); + } - // Unload background video - progTrace("Unloading main video file"); - if (_global.conf->isFrameFile) { - frameFileUnload(_global.frameFileHandle); - } else { - videoUnload(_global.videoHandle); - } + // Unload background video + progTrace("Unloading main video file"); + if (_global.conf->isFrameFile) { + frameFileUnload(_global.frameFileHandle); + } else { + videoUnload(_global.videoHandle); + } - // Stop controllers - progTrace("Stopping controllers"); - stopControllers(); + // Stop controllers + progTrace("Stopping controllers"); + stopControllers(); - // Stop mice - progTrace("Re-enabling mouse pointer"); - SDL_ShowCursor(SDL_ENABLE); - progTrace("Stopping ManyMouse"); - ManyMouse_Quit(); + // Stop mice + progTrace("Re-enabling mouse pointer"); + SDL_ShowCursor(SDL_ENABLE); + progTrace("Stopping ManyMouse"); + ManyMouse_Quit(); - // Release global conf memory - destroyConf(&_global.conf); + // Release global conf memory + destroyConf(&_global.conf); - // Release control mappings - for (x=0; x 4) _global.controllerCount = 4; + // Clamp to the first four controllers found for now + _global.controllerCount = SDL_NumJoysticks(); + if (_global.controllerCount > 4) _global.controllerCount = 4; - _global.controllers = (SDL_GameController **)malloc(sizeof(SDL_GameController *) * (size_t)_global.controllerCount); - for (x=0; x<_global.controllerCount; x++) { - _global.controllers[x] = NULL; - if (SDL_IsGameController(x)) { - _global.controllers[x] = SDL_GameControllerOpen(x); - if (_global.controllers[x]) { - progTrace("Found %d - %s", x, SDL_GameControllerName(_global.controllers[x])); - } else { - progTrace("Controller %d not opened", x); - } - } else { - progTrace("Device %d is not a controller", x); - } - } + _global.controllers = (SDL_GameController **)malloc(sizeof(SDL_GameController *) * (size_t)_global.controllerCount); + for (x=0; x<_global.controllerCount; x++) { + _global.controllers[x] = NULL; + if (SDL_IsGameController(x)) { + _global.controllers[x] = SDL_GameControllerOpen(x); + if (_global.controllers[x]) { + progTrace("Found %d - %s", x, SDL_GameControllerName(_global.controllers[x])); + } else { + progTrace("Controller %d not opened", x); + } + } else { + progTrace("Device %d is not a controller", x); + } + } - SDL_GameControllerEventState(SDL_ENABLE); + SDL_GameControllerEventState(SDL_ENABLE); } void startLuaContext(lua_State *L) { - luaL_openlibs(L); - lua_atpanic(L, luaError); + luaL_openlibs(L); + lua_atpanic(L, luaError); - luaPreload(L, "lfs", luaopen_lfs); - luaPreload(L, "socket.core", luaopen_socket_core); - luaPreload(L, "mime.core", luaopen_mime_core); + luaPreload(L, "lfs", luaopen_lfs); + luaPreload(L, "socket.core", luaopen_socket_core); + luaPreload(L, "mime.core", luaopen_mime_core); luaPreload(L, "rs232", luaopen_luars232); #ifndef _WIN32 - luaPreload(L, "socket.unix", luaopen_socket_unix); - luaPreload(L, "socket.serial", luaopen_socket_serial); + luaPreload(L, "socket.unix", luaopen_socket_unix); + luaPreload(L, "socket.serial", luaopen_socket_serial); #endif - /* - ***TODO*** Load these Lua modules: + /* + ***TODO*** Load these Lua modules: - Lua Socket: - ftp.lua - headers.lua - http.lua - ltn12.lua - mbox.lua - mime.lua - smtp.lua - socket.lua - tp.lua - url.lua + Lua Socket: + ftp.lua + headers.lua + http.lua + ltn12.lua + mbox.lua + mime.lua + smtp.lua + socket.lua + tp.lua + url.lua - librs232: - rs232.lua - */ + librs232: + rs232.lua + */ } void stopControllers(void) { - int32_t x; + int32_t x; - if (_global.controllerCount > 0) { - for (x=0; x<_global.controllerCount; x++) { - if (_global.controllers[x] != NULL) { - SDL_GameControllerClose(_global.controllers[x]); - _global.controllers[x] = NULL; - } - } - free(_global.controllers); - _global.controllers = NULL; - _global.controllerCount = 0; - } + if (_global.controllerCount > 0) { + for (x=0; x<_global.controllerCount; x++) { + if (_global.controllers[x] != NULL) { + SDL_GameControllerClose(_global.controllers[x]); + _global.controllers[x] = NULL; + } + } + free(_global.controllers); + _global.controllers = NULL; + _global.controllerCount = 0; + } } void takeScreenshot(void) { - int32_t x = 0; - char filename[1024]; - void *pixels = NULL; - SDL_Surface *surface = NULL; - SDL_Rect viewport; + int32_t x = 0; + char filename[1024]; + void *pixels = NULL; + SDL_Surface *surface = NULL; + SDL_Rect viewport; - while (x <= 999) { - snprintf(filename, 1024, "%ssinge%03d.png", _global.conf->dataDir, x); - if (!utilFileExists(filename)) break; - x++; - } - if (x > 999) utilDie("Seriously? You have 1000 screenshots in this folder? Remove some."); + while (x <= 999) { + snprintf(filename, 1024, "%ssinge%03d.png", _global.conf->dataDir, x); + if (!utilFileExists(filename)) break; + x++; + } + if (x > 999) utilDie("Seriously? You have 1000 screenshots in this folder? Remove some."); - SDL_RenderGetViewport(_global.renderer, &viewport); - surface = SDL_CreateRGBSurface(0, viewport.w, viewport.h, 32, 0, 0, 0, 0); - if (!surface) utilDie("%s", SDL_GetError()); - if (SDL_RenderReadPixels(_global.renderer, NULL, surface->format->format, surface->pixels, surface->pitch) != 0) utilDie("%s", SDL_GetError()); - //***FIX*** This crashes with a SEGFAULT sometimes. Not sure why. - if (IMG_SavePNG(surface, filename) < 0) utilDie("%s", IMG_GetError()); - SDL_FreeSurface(surface); - free(pixels); + SDL_RenderGetViewport(_global.renderer, &viewport); + surface = SDL_CreateRGBSurface(0, viewport.w, viewport.h, 32, 0, 0, 0, 0); + if (!surface) utilDie("%s", SDL_GetError()); + if (SDL_RenderReadPixels(_global.renderer, NULL, surface->format->format, surface->pixels, surface->pitch) != 0) utilDie("%s", SDL_GetError()); + //***FIX*** This crashes with a SEGFAULT sometimes. Not sure why. + if (IMG_SavePNG(surface, filename) < 0) utilDie("%s", IMG_GetError()); + SDL_FreeSurface(surface); + free(pixels); } void updatePauseState(void) { - VideoT *video = NULL; - VideoT *videoTemp = NULL; + VideoT *video = NULL; + VideoT *videoTemp = NULL; - if (_global.pauseState) { - // Pause laserdisc - if (!_global.discStopped) { - if (videoIsPlaying(_global.videoHandle)) { - _global.wasPlayingBeforePause = true; - videoPause(_global.videoHandle); - } - } - // Pause videos - HASH_ITER(hh, _global.videoList, video, videoTemp) { - if (videoIsPlaying(video->handle)) { - video->wasPlayingBeforePause = true; - videoPause(video->handle); - } - } - // Pause sounds - Mix_Pause(-1); - } else { - // Resume laserdisc - if ((!_global.discStopped) && (_global.wasPlayingBeforePause)) { - _global.wasPlayingBeforePause = false; - videoPlay(_global.videoHandle); - } - // Resume videos - HASH_ITER(hh, _global.videoList, video, videoTemp) { - if (video->wasPlayingBeforePause) { - video->wasPlayingBeforePause = false; - videoPlay(video->handle); - } - } - // Resume laserdisc - Mix_Resume(-1); - } + if (_global.pauseState) { + // Pause laserdisc + if (!_global.discStopped) { + if (videoIsPlaying(_global.videoHandle)) { + _global.wasPlayingBeforePause = true; + videoPause(_global.videoHandle); + } + } + // Pause videos + HASH_ITER(hh, _global.videoList, video, videoTemp) { + if (videoIsPlaying(video->handle)) { + video->wasPlayingBeforePause = true; + videoPause(video->handle); + } + } + // Pause sounds + Mix_Pause(-1); + } else { + // Resume laserdisc + if ((!_global.discStopped) && (_global.wasPlayingBeforePause)) { + _global.wasPlayingBeforePause = false; + videoPlay(_global.videoHandle); + } + // Resume videos + HASH_ITER(hh, _global.videoList, video, videoTemp) { + if (video->wasPlayingBeforePause) { + video->wasPlayingBeforePause = false; + videoPlay(video->handle); + } + } + // Resume laserdisc + Mix_Resume(-1); + } }