From 24cf564401d7ba4433a3074ca9ed49b922bdd37e Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Fri, 6 Mar 2020 18:57:56 -0600 Subject: [PATCH] New Framework.singe and controller configuration mapping. --- .gitignore | 2 + singe/Framework.singe | 293 ++++++++++++++++++++++++++++++++++++++- singe/config.lua | 310 ------------------------------------------ singe/controls.cfg | 27 ++++ singe/preBuild.sh | 6 + singe/singe.c | 172 ++++++++++++++++++++++- singe/singe.pro | 4 +- 7 files changed, 499 insertions(+), 315 deletions(-) delete mode 100644 singe/config.lua create mode 100644 singe/controls.cfg diff --git a/.gitignore b/.gitignore index b7c76731e..029d2cc85 100644 --- a/.gitignore +++ b/.gitignore @@ -42,5 +42,7 @@ singe/singeLogo.h singe/indexing.h singe/laserDisc.h singe/magnifyingGlass.h +singe/Framework_singe.h +singe/controls_cfg.h videotest/indexing/ Makefile.in diff --git a/singe/Framework.singe b/singe/Framework.singe index fa8302096..895e958f6 100644 --- a/singe/Framework.singe +++ b/singe/Framework.singe @@ -1,4 +1,293 @@ -discSearch(1) +-- Singe 2.xx Features + +SCANCODE = { + A = 4, + B = 5, + C = 6, + D = 7, + E = 8, + F = 9, + G = 10, + H = 11, + I = 12, + J = 13, + K = 14, + L = 15, + M = 16, + N = 17, + O = 18, + P = 19, + Q = 20, + R = 21, + S = 22, + T = 23, + U = 24, + V = 25, + W = 26, + X = 27, + Y = 28, + Z = 29, + MAIN_1 = 30, + MAIN_2 = 31, + MAIN_3 = 32, + MAIN_4 = 33, + MAIN_5 = 34, + MAIN_6 = 35, + MAIN_7 = 36, + MAIN_8 = 37, + MAIN_9 = 38, + MAIN_0 = 39, + RETURN = 40, + ESCAPE = 41, + BACKSPACE = 42, + TAB = 43, + SPACE = 44, + MINUS = 45, + EQUALS = 46, + LEFTBRACKET = 47, + RIGHTBRACKET = 48, + BACKSLASH = 49, + NONUSHASH = 50, + SEMICOLON = 51, + APOSTROPHE = 52, + GRAVE = 53, + COMMA = 54, + PERIOD = 55, + SLASH = 56, + CAPSLOCK = 57, + F1 = 58, + F2 = 59, + F3 = 60, + F4 = 61, + F5 = 62, + F6 = 63, + F7 = 64, + F8 = 65, + F9 = 66, + F10 = 67, + F11 = 68, + F12 = 69, + PRINTSCREEN = 70, + SCROLLLOCK = 71, + PAUSE = 72, + INSERT = 73, + HOME = 74, + PAGEUP = 75, + DELETE = 76, + END = 77, + PAGEDOWN = 78, + RIGHT = 79, + LEFT = 80, + DOWN = 81, + UP = 82, + NUMLOCKCLEAR = 83, + KP_DIVIDE = 84, + KP_MULTIPLY = 85, + KP_MINUS = 86, + KP_PLUS = 87, + KP_ENTER = 88, + KP_1 = 89, + KP_2 = 90, + KP_3 = 91, + KP_4 = 92, + KP_5 = 93, + KP_6 = 94, + KP_7 = 95, + KP_8 = 96, + KP_9 = 97, + KP_0 = 98, + KP_PERIOD = 99, + NONUSBACKSLASH = 100, + APPLICATION = 101, + POWER = 102, + KP_EQUALS = 103, + F13 = 104, + F14 = 105, + F15 = 106, + F16 = 107, + F17 = 108, + F18 = 109, + F19 = 110, + F20 = 111, + F21 = 112, + F22 = 113, + F23 = 114, + F24 = 115, + EXECUTE = 116, + HELP = 117, + MENU = 118, + SELECT = 119, + STOP = 120, + AGAIN = 121, + UNDO = 122, + CUT = 123, + COPY = 124, + PASTE = 125, + FIND = 126, + MUTE = 127, + VOLUMEUP = 128, + VOLUMEDOWN = 129, + KP_COMMA = 133, + KP_EQUALSAS400 = 134, + INTERNATIONAL1 = 135, + INTERNATIONAL2 = 136, + INTERNATIONAL3 = 137, + INTERNATIONAL4 = 138, + INTERNATIONAL5 = 139, + INTERNATIONAL6 = 140, + INTERNATIONAL7 = 141, + INTERNATIONAL8 = 142, + INTERNATIONAL9 = 143, + LANG1 = 144, + LANG2 = 145, + LANG3 = 146, + LANG4 = 147, + LANG5 = 148, + LANG6 = 149, + LANG7 = 150, + LANG8 = 151, + LANG9 = 152, + ALTERASE = 153, + SYSREQ = 154, + CANCEL = 155, + CLEAR = 156, + PRIOR = 157, + RETURN2 = 158, + SEPARATOR = 159, + OUT = 160, + OPER = 161, + CLEARAGAIN = 162, + CRSEL = 163, + EXSEL = 164, + KP_00 = 176, + KP_000 = 177, + THOUSANDSSEPARATOR = 178, + DECIMALSEPARATOR = 179, + CURRENCYUNIT = 180, + CURRENCYSUBUNIT = 181, + KP_LEFTPAREN = 182, + KP_RIGHTPAREN = 183, + KP_LEFTBRACE = 184, + KP_RIGHTBRACE = 185, + KP_TAB = 186, + KP_BACKSPACE = 187, + KP_A = 188, + KP_B = 189, + KP_C = 190, + KP_D = 191, + KP_E = 192, + KP_F = 193, + KP_XOR = 194, + KP_POWER = 195, + KP_PERCENT = 196, + KP_LESS = 197, + KP_GREATER = 198, + KP_AMPERSAND = 199, + KP_DBLAMPERSAND = 200, + KP_VERTICALBAR = 201, + KP_DBLVERTICALBAR = 202, + KP_COLON = 203, + KP_HASH = 204, + KP_SPACE = 205, + KP_AT = 206, + KP_EXCLAM = 207, + KP_MEMSTORE = 208, + KP_MEMRECALL = 209, + KP_MEMCLEAR = 210, + KP_MEMADD = 211, + KP_MEMSUBTRACT = 212, + KP_MEMMULTIPLY = 213, + KP_MEMDIVIDE = 214, + KP_PLUSMINUS = 215, + KP_CLEAR = 216, + KP_CLEARENTRY = 217, + KP_BINARY = 218, + KP_OCTAL = 219, + KP_DECIMAL = 220, + KP_HEXADECIMAL = 221, + LCTRL = 224, + LSHIFT = 225, + LALT = 226, + LGUI = 227, + RCTRL = 228, + RSHIFT = 229, + RALT = 230, + RGUI = 231, + MODE = 257, + AUDIONEXT = 258, + AUDIOPREV = 259, + AUDIOSTOP = 260, + AUDIOPLAY = 261, + AUDIOMUTE = 262, + MEDIASELECT = 263, + WWW = 264, + MAIL = 265, + CALCULATOR = 266, + COMPUTER = 267, + AC_SEARCH = 268, + AC_HOME = 269, + AC_BACK = 270, + AC_FORWARD = 271, + AC_STOP = 272, + AC_REFRESH = 273, + AC_BOOKMARKS = 274, + BRIGHTNESSDOWN = 275, + BRIGHTNESSUP = 276, + DISPLAYSWITCH = 277, + KBDILLUMTOGGLE = 278, + KBDILLUMDOWN = 279, + KBDILLUMUP = 280, + EJECT = 281, + SLEEP = 282, + APP1 = 283, + APP2 = 284, + AUDIOREWIND = 285, + AUDIOFASTFORWARD = 286 +} + +GAMEPAD_1 = { + AXIS_LEFT_X = -1, + AXIS_LEFT_Y = -2, + AXIS_RIGHT_X = -3, + AXIS_RIGHT_Y = -4, + AXIS_LEFT_TRIGGER = -5, + AXIS_RIGHT_TRIGGER = -6, + BUTTON_A = -7, + BUTTON_B = -8, + BUTTON_X = -9, + BUTTON_Y = -10, + BUTTON_BACK = -11, + BUTTON_GUIDE = -12, + BUTTON_START = -13, + BUTTON_LEFT_STICK = -14, + BUTTON_RIGHT_STICK = -15, + BUTTON_LEFT_BUMPER = -16, + BUTTON_RIGHT_BUMPER = -17, + DPAD_UP = -18, + DPAD_DOWN = -19, + DPAD_LEFT = -20, + DPAD_RIGHT = -21 +} + +GAMEPAD_2 = {} +GAMEPAD_3 = {} +GAMEPAD_4 = {} +for key, value in pairs(GAMEPAD_1) do + GAMEPAD_2[key] = value + -21 + GAMEPAD_3[key] = value + -21 * 2 + GAMEPAD_4[key] = value + -21 * 3 +end + +SWITCH_BUTTON4 = 21 +SWITCH_TILT = 22 +RESET_CPU = 23 + + +-- Singe 1.xx Features + + +if discSetFPS ~= nil then discSetFPS(29.97) end +if discSearch ~= nil then discSearch(1) end SWITCH_UP = 0 SWITCH_LEFT = 1 @@ -21,8 +310,6 @@ SWITCH_SCREENSHOT = 17 SWITCH_QUIT = 18 SWITCH_PAUSE = 19 SWITCH_CONSOLE = 20 -SWITCH_BUTTON4 = 21 -SWITCH_TILT = 22 FONT_QUALITY_SOLID = 1 FONT_QUALITY_SHADED = 2 diff --git a/singe/config.lua b/singe/config.lua deleted file mode 100644 index 640155e59..000000000 --- a/singe/config.lua +++ /dev/null @@ -1,310 +0,0 @@ --- Configuration Constants - --- These match SDL2s SDL_scancode.h -SCANCODE = { - UNKNOWN = 0, - A = 4, - B = 5, - C = 6, - D = 7, - E = 8, - F = 9, - G = 10, - H = 11, - I = 12, - J = 13, - K = 14, - L = 15, - M = 16, - N = 17, - O = 18, - P = 19, - Q = 20, - R = 21, - S = 22, - T = 23, - U = 24, - V = 25, - W = 26, - X = 27, - Y = 28, - Z = 29, - MAIN_1 = 30, - MAIN_2 = 31, - MAIN_3 = 32, - MAIN_4 = 33, - MAIN_5 = 34, - MAIN_6 = 35, - MAIN_7 = 36, - MAIN_8 = 37, - MAIN_9 = 38, - MAIN_0 = 39, - RETURN = 40, - ESCAPE = 41, - BACKSPACE = 42, - TAB = 43, - SPACE = 44, - MINUS = 45, - EQUALS = 46, - LEFTBRACKET = 47, - RIGHTBRACKET = 48, - BACKSLASH = 49, - NONUSHASH = 50, - SEMICOLON = 51, - APOSTROPHE = 52, - GRAVE = 53, - COMMA = 54, - PERIOD = 55, - SLASH = 56, - CAPSLOCK = 57, - F1 = 58, - F2 = 59, - F3 = 60, - F4 = 61, - F5 = 62, - F6 = 63, - F7 = 64, - F8 = 65, - F9 = 66, - F10 = 67, - F11 = 68, - F12 = 69, - PRINTSCREEN = 70, - SCROLLLOCK = 71, - PAUSE = 72, - INSERT = 73, - HOME = 74, - PAGEUP = 75, - DELETE = 76, - END = 77, - PAGEDOWN = 78, - RIGHT = 79, - LEFT = 80, - DOWN = 81, - UP = 82, - NUMLOCKCLEAR = 83, - KP_DIVIDE = 84, - KP_MULTIPLY = 85, - KP_MINUS = 86, - KP_PLUS = 87, - KP_ENTER = 88, - KP_1 = 89, - KP_2 = 90, - KP_3 = 91, - KP_4 = 92, - KP_5 = 93, - KP_6 = 94, - KP_7 = 95, - KP_8 = 96, - KP_9 = 97, - KP_0 = 98, - KP_PERIOD = 99, - NONUSBACKSLASH = 100, - APPLICATION = 101, - POWER = 102, - KP_EQUALS = 103, - F13 = 104, - F14 = 105, - F15 = 106, - F16 = 107, - F17 = 108, - F18 = 109, - F19 = 110, - F20 = 111, - F21 = 112, - F22 = 113, - F23 = 114, - F24 = 115, - EXECUTE = 116, - HELP = 117, - MENU = 118, - SELECT = 119, - STOP = 120, - AGAIN = 121, - UNDO = 122, - CUT = 123, - COPY = 124, - PASTE = 125, - FIND = 126, - MUTE = 127, - VOLUMEUP = 128, - VOLUMEDOWN = 129, - KP_COMMA = 133, - KP_EQUALSAS400 = 134, - INTERNATIONAL1 = 135, - INTERNATIONAL2 = 136, - INTERNATIONAL3 = 137, - INTERNATIONAL4 = 138, - INTERNATIONAL5 = 139, - INTERNATIONAL6 = 140, - INTERNATIONAL7 = 141, - INTERNATIONAL8 = 142, - INTERNATIONAL9 = 143, - LANG1 = 144, - LANG2 = 145, - LANG3 = 146, - LANG4 = 147, - LANG5 = 148, - LANG6 = 149, - LANG7 = 150, - LANG8 = 151, - LANG9 = 152, - ALTERASE = 153, - SYSREQ = 154, - CANCEL = 155, - CLEAR = 156, - PRIOR = 157, - RETURN2 = 158, - SEPARATOR = 159, - OUT = 160, - OPER = 161, - CLEARAGAIN = 162, - CRSEL = 163, - EXSEL = 164, - KP_00 = 176, - KP_000 = 177, - THOUSANDSSEPARATOR = 178, - DECIMALSEPARATOR = 179, - CURRENCYUNIT = 180, - CURRENCYSUBUNIT = 181, - KP_LEFTPAREN = 182, - KP_RIGHTPAREN = 183, - KP_LEFTBRACE = 184, - KP_RIGHTBRACE = 185, - KP_TAB = 186, - KP_BACKSPACE = 187, - KP_A = 188, - KP_B = 189, - KP_C = 190, - KP_D = 191, - KP_E = 192, - KP_F = 193, - KP_XOR = 194, - KP_POWER = 195, - KP_PERCENT = 196, - KP_LESS = 197, - KP_GREATER = 198, - KP_AMPERSAND = 199, - KP_DBLAMPERSAND = 200, - KP_VERTICALBAR = 201, - KP_DBLVERTICALBAR = 202, - KP_COLON = 203, - KP_HASH = 204, - KP_SPACE = 205, - KP_AT = 206, - KP_EXCLAM = 207, - KP_MEMSTORE = 208, - KP_MEMRECALL = 209, - KP_MEMCLEAR = 210, - KP_MEMADD = 211, - KP_MEMSUBTRACT = 212, - KP_MEMMULTIPLY = 213, - KP_MEMDIVIDE = 214, - KP_PLUSMINUS = 215, - KP_CLEAR = 216, - KP_CLEARENTRY = 217, - KP_BINARY = 218, - KP_OCTAL = 219, - KP_DECIMAL = 220, - KP_HEXADECIMAL = 221, - LCTRL = 224, - LSHIFT = 225, - LALT = 226, - LGUI = 227, - RCTRL = 228, - RSHIFT = 229, - RALT = 230, - RGUI = 231, - MODE = 257, - AUDIONEXT = 258, - AUDIOPREV = 259, - AUDIOSTOP = 260, - AUDIOPLAY = 261, - AUDIOMUTE = 262, - MEDIASELECT = 263, - WWW = 264, - MAIL = 265, - CALCULATOR = 266, - COMPUTER = 267, - AC_SEARCH = 268, - AC_HOME = 269, - AC_BACK = 270, - AC_FORWARD = 271, - AC_STOP = 272, - AC_REFRESH = 273, - AC_BOOKMARKS = 274, - BRIGHTNESSDOWN = 275, - BRIGHTNESSUP = 276, - DISPLAYSWITCH = 277, - KBDILLUMTOGGLE = 278, - KBDILLUMDOWN = 279, - KBDILLUMUP = 280, - EJECT = 281, - SLEEP = 282, - APP1 = 283, - APP2 = 284, - AUDIOREWIND = 285, - AUDIOFASTFORWARD = 286 -} - --- These sorta match SDL2s SDL_gamecontroller.h -GAMEPAD_1 = { - AXIS_LEFT_X = -1, - AXIS_LEFT_Y = -2, - AXIS_RIGHT_X = -3, - AXIS_RIGHT_Y = -4, - AXIS_LEFT_TRIGGER = -5, - AXIS_RIGHT_TRIGGER = -6, - BUTTON_A = -7, - BUTTON_B = -8, - BUTTON_X = -9, - BUTTON_Y = -10, - BUTTON_BACK = -11, - BUTTON_GUIDE = -12, - BUTTON_START = -13, - BUTTON_LEFT_STICK = -14, - BUTTON_RIGHT_STICK = -15, - BUTTON_LEFT_BUMPER = -16, - BUTTON_RIGHT_BUMPER = -17, - DPAD_UP = -18, - DPAD_DOWN = -19, - DPAD_LEFT = -20, - DPAD_RIGHT = -21 -} - -GAMEPAD_2 = {} -GAMEPAD_3 = {} -GAMEPAD_4 = {} -for key, value in pairs(GAMEPAD_1) do - GAMEPAD_2[key] = value + -21 - GAMEPAD_3[key] = value + -21 * 2 - GAMEPAD_4[key] = value + -21 * 3 -end - --- Default Mappings - -DEAD_ZONE = 10 - -INPUT_UP = { SCANCODE.UP, SCANCODE.KP_8, GAMEPAD_1.AXIS_LEFT_Y, GAMEPAD_1.AXIS_RIGHT_Y, GAMEPAD_1.DPAD_UP } -INPUT_LEFT = { SCANCODE.LEFT, SCANCODE.KP_4 GAMEPAD_1.AXIS_LEFT_X, GAMEPAD_1.AXIS_RIGHT_X, GAMEPAD_1.DPAD_LEFT } -INPUT_DOWN = { SCANCODE.DOWN, SCANCODE.KP_2 GAMEPAD_1.AXIS_LEFT_Y, GAMEPAD_1.AXIS_RIGHT_Y, GAMEPAD_1.DPAD_DOWN } -INPUT_RIGHT = { SCANCODE.RIGHT, SCANCODE.KP_6 GAMEPAD_1.AXIS_LEFT_X, GAMEPAD_1.AXIS_RIGHT_X, GAMEPAD_1.DPAD_RIGHT } -INPUT_1P_COIN = { SCANCODE.MAIN_5, SCANCODE.C, GAMEPAD_1.BUTTON_LEFT_BUMPER } -INPUT_2P_COIN = { SCANCODE.MAIN_6 } -INPUT_1P_START = { SCANCODE.MAIN_1, GAMEPAD_1.BUTTON_RIGHT_BUMPER } -INPUT_2P_START = { SCANCODE.MAIN_2 } -INPUT_ACTION_1 = { SCANCODE.SPACE, SCANCODE.LCTRL, GAMEPAD_1.BUTTON_A } -INPUT_ACTION_2 = { SCANCODE.LALT, GAMEPAD_1.BUTTON_B } -INPUT_ACTION_3 = { SCANCODE.LSHIFT, GAMEPAD_1.BUTTON_X } -INPUT_ACTION_4 = { SCANCODE.RSHIFT, GAMEPAD_1.BUTTON_Y } -INPUT_SKILL_EASY = { SCANCODE.KP_DIVIDE } -INPUT_SKILL_MEDIUM = { SCANCODE.KP_MULTIPLY } -INPUT_SKILL_HARD = { SCANCODE.KP_MINUS } -INPUT_SERVICE_COIN = { SCANCODE.MAIN_9 } -INPUT_TEST_MODE = { SCANCODE.F2 } -INPUT_RESET_CPU = { SCANCODE.F3 } -INPUT_SCREENSHOT = { SCANCODE.F12, SCANCODE.F11, GAMEPAD_1.BUTTON_BACK } -INPUT_QUIT = { SCANCODE.ESCAPE, SCANCODE.Q } -INPUT_PAUSE = { SCANCODE.P, GAMEPAD_1.BUTTON_START } -INPUT_CONSOLE = { SCANCODE.GRAVE } -INPUT_TILT = { SCANCODE.T } diff --git a/singe/controls.cfg b/singe/controls.cfg new file mode 100644 index 000000000..04501c83e --- /dev/null +++ b/singe/controls.cfg @@ -0,0 +1,27 @@ +-- Default Mappings + +DEAD_ZONE = 10 + +INPUT_UP = { SCANCODE.UP, SCANCODE.KP_8, GAMEPAD_1.AXIS_LEFT_Y, GAMEPAD_1.AXIS_RIGHT_Y, GAMEPAD_1.DPAD_UP } +INPUT_LEFT = { SCANCODE.LEFT, SCANCODE.KP_4, GAMEPAD_1.AXIS_LEFT_X, GAMEPAD_1.AXIS_RIGHT_X, GAMEPAD_1.DPAD_LEFT } +INPUT_DOWN = { SCANCODE.DOWN, SCANCODE.KP_2, GAMEPAD_1.AXIS_LEFT_Y, GAMEPAD_1.AXIS_RIGHT_Y, GAMEPAD_1.DPAD_DOWN } +INPUT_RIGHT = { SCANCODE.RIGHT, SCANCODE.KP_6, GAMEPAD_1.AXIS_LEFT_X, GAMEPAD_1.AXIS_RIGHT_X, GAMEPAD_1.DPAD_RIGHT } +INPUT_1P_COIN = { SCANCODE.MAIN_5, SCANCODE.C, GAMEPAD_1.BUTTON_LEFT_BUMPER } +INPUT_2P_COIN = { SCANCODE.MAIN_6 } +INPUT_1P_START = { SCANCODE.MAIN_1, GAMEPAD_1.BUTTON_RIGHT_BUMPER } +INPUT_2P_START = { SCANCODE.MAIN_2 } +INPUT_ACTION_1 = { SCANCODE.SPACE, SCANCODE.LCTRL, GAMEPAD_1.BUTTON_A } +INPUT_ACTION_2 = { SCANCODE.LALT, GAMEPAD_1.BUTTON_B } +INPUT_ACTION_3 = { SCANCODE.LSHIFT, GAMEPAD_1.BUTTON_X } +INPUT_ACTION_4 = { SCANCODE.RSHIFT, GAMEPAD_1.BUTTON_Y } +INPUT_SKILL_EASY = { SCANCODE.KP_DIVIDE } +INPUT_SKILL_MEDIUM = { SCANCODE.KP_MULTIPLY } +INPUT_SKILL_HARD = { SCANCODE.KP_MINUS } +INPUT_SERVICE = { SCANCODE.MAIN_9 } +INPUT_TEST_MODE = { SCANCODE.F2 } +INPUT_RESET_CPU = { SCANCODE.F3 } +INPUT_SCREENSHOT = { SCANCODE.F12, SCANCODE.F11, GAMEPAD_1.BUTTON_BACK } +INPUT_QUIT = { SCANCODE.ESCAPE, SCANCODE.Q } +INPUT_PAUSE = { SCANCODE.P, GAMEPAD_1.BUTTON_START } +INPUT_CONSOLE = { SCANCODE.GRAVE } +INPUT_TILT = { SCANCODE.T } diff --git a/singe/preBuild.sh b/singe/preBuild.sh index 9eca7aa23..df43fb0a5 100755 --- a/singe/preBuild.sh +++ b/singe/preBuild.sh @@ -506,3 +506,9 @@ createEmbeddedImage magnifyingGlass # === "Indexing" Text === createEmbeddedImage indexing + +# === Singe Framework === +createEmbeddedBinary Framework.singe Framework_singe.h FRAMEWORK_SINGE_H + +# === Default Config === +createEmbeddedBinary controls.cfg controls_cfg.h CONTROLS_CFG_H diff --git a/singe/singe.c b/singe/singe.c index a3eedcd39..9f777ce58 100644 --- a/singe/singe.c +++ b/singe/singe.c @@ -43,8 +43,12 @@ #include "laserDisc.h" #include "magnifyingGlass.h" #include "indexing.h" +#include "Framework_singe.h" +#include "controls_cfg.h" +//#define DEBUG_TOOLS + #define AUDIO_MAX_VOLUME 63 #define MAX_TITLE_LENGTH 1024 #define MAX_MICE 128 @@ -54,6 +58,33 @@ #define MOUSE_ARRAY_SIZE 6 +// Index into _controlMappings array +#define INPUT_UP 0 +#define INPUT_LEFT 1 +#define INPUT_DOWN 2 +#define INPUT_RIGHT 3 +#define INPUT_1P_START 4 +#define INPUT_2P_START 5 +#define INPUT_ACTION_1 6 +#define INPUT_ACTION_2 7 +#define INPUT_ACTION_3 8 +#define INPUT_1P_COIN 9 +#define INPUT_2P_COIN 10 +#define INPUT_SKILL_EASY 11 +#define INPUT_SKILL_MEDIUM 12 +#define INPUT_SKILL_HARD 13 +#define INPUT_SERVICE 14 +#define INPUT_TEST_MODE 15 +#define INPUT_SCREENSHOT 16 +#define INPUT_QUIT 17 +#define INPUT_PAUSE 18 +#define INPUT_CONSOLE 19 +#define INPUT_ACTION_4 20 +#define INPUT_TILT 21 +#define INPUT_RESET_CPU 22 +#define INPUT_COUNT 23 + + typedef struct MouseS { int32_t x; int32_t y; @@ -98,6 +129,13 @@ typedef struct FontS { UT_hash_handle hh; } FontT; +typedef struct MappingS { + char *name; + int32_t frameworkIndex; + int32_t inputCount; + int32_t *input; +} MappingT; + enum { SWITCH_UP, @@ -179,6 +217,7 @@ static SDL_Window *_window = NULL; static SDL_Renderer *_renderer = NULL; static SDL_Texture *_videoTexture = NULL; static SDL_Surface *_consoleFontSurface = NULL; +static int32_t _controllerDeadZone = 0; static int32_t _consoleFontWidth = 0; static int32_t _consoleFontHeight = 0; static int32_t _nextSpriteId = 0; @@ -248,6 +287,32 @@ static int _fullKeybdDefs[] = { SDLK_PERIOD }; +static MappingT _controlMappings[] = { + { "INPUT_UP", 0, 0, NULL }, + { "INPUT_LEFT", 1, 0, NULL }, + { "INPUT_DOWN", 2, 0, NULL }, + { "INPUT_RIGHT", 3, 0, NULL }, + { "INPUT_1P_START", 4, 0, NULL }, + { "INPUT_2P_START", 5, 0, NULL }, + { "INPUT_ACTION_1", 6, 0, NULL }, + { "INPUT_ACTION_2", 7, 0, NULL }, + { "INPUT_ACTION_3", 8, 0, NULL }, + { "INPUT_1P_COIN", 9, 0, NULL }, + { "INPUT_2P_COIN", 10, 0, NULL }, + { "INPUT_SKILL_EASY", 11, 0, NULL }, + { "INPUT_SKILL_MEDIUM", 12, 0, NULL }, + { "INPUT_SKILL_HARD", 13, 0, NULL }, + { "INPUT_SERVICE", 14, 0, NULL }, + { "INPUT_TEST_MODE", 15, 0, NULL }, + { "INPUT_SCREENSHOT", 17, 0, NULL }, + { "INPUT_QUIT", 18, 0, NULL }, + { "INPUT_PAUSE", 19, 0, NULL }, + { "INPUT_CONSOLE", 20, 0, NULL }, + { "INPUT_ACTION_4", 21, 0, NULL }, + { "INPUT_TILT", 22, 0, NULL }, + { "INPUT_RESET_CPU", 23, 0, NULL } +}; + int32_t apiColorBackground(lua_State *L); int32_t apiColorForeground(lua_State *L); @@ -321,6 +386,9 @@ int32_t luaError(lua_State *L); void luaTrace(lua_State *L, char *method, char *fmt, ...); void processKey(bool down, int keysym); +#ifdef DEBUG_TOOLS +void luaStackDump(lua_State *L); +#endif int32_t apiColorBackground(lua_State *L) { int32_t n = lua_gettop(L); @@ -2072,6 +2140,41 @@ int32_t luaError(lua_State *L) { } +#ifdef DEBUG_TOOLS +void luaStackDump(lua_State *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; + + case LUA_TBOOLEAN: + printf(lua_toboolean(L, i) ? "true" : "false"); + break; + + case LUA_TNUMBER: + printf("%g", lua_tonumber(L, i)); + break; + + default: + printf("%s", lua_typename(L, t)); + break; + + } + printf(" "); + } + printf("\n"); +} +#endif + + void luaTrace(lua_State *L, char *method, char *fmt, ...) { va_list args; lua_Debug ar; @@ -2169,6 +2272,8 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { int32_t intReturn = 0; int64_t thisFrame = -1; int64_t lastFrame = -1; + char *temp = NULL; + char *temp2 = NULL; SDL_Rect windowTarget; SDL_Rect sindenWhite; SDL_Rect sindenBlack; @@ -2197,11 +2302,76 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { _window = window; _renderer = renderer; + // Load controller mappings + _luaContext = luaL_newstate(); + luaL_openlibs(_luaContext); + lua_atpanic(_luaContext, luaError); + // Load framework + if (luaL_loadbuffer(_luaContext, (char *)Framework_singe, Framework_singe_len, "Input Mappings") || lua_pcall(_luaContext, 0, 0, 0)) utilDie("%s", lua_tostring(_luaContext, -1)); + // Load default mappings + if (luaL_loadbuffer(_luaContext, (char *)controls_cfg, controls_cfg_len, "Input Mappings") || lua_pcall(_luaContext, 0, 0, 0)) utilDie("%s", lua_tostring(_luaContext, -1)); + if (utilFileExists("controls.cfg") && luaL_dofile(_luaContext, "controls.cfg")) utilDie("%s", lua_tostring(_luaContext, -1)); + // Load mappings in main data dir + temp = utilCreateString("%s..%ccontrols.cfg", _confDataDir, utilGetPathSeparator()); + if (utilFileExists(temp) && luaL_dofile(_luaContext, temp)) utilDie("%s", lua_tostring(_luaContext, -1)); + free(temp); + // Load mappings in game data dir + temp = utilCreateString("%scontrols.cfg", _confDataDir); + if (utilFileExists(temp) && luaL_dofile(_luaContext, temp)) utilDie("%s", lua_tostring(_luaContext, -1)); + free(temp); + // Load mappings in game script dir + temp = strdup(_confScriptFile); + temp2 = strndup(temp, strlen(temp) - strlen(utilGetLastPathComponent(temp))); + free(temp); + temp = utilCreateString("%scontrols.cfg", temp2); + if (utilFileExists(temp) && luaL_dofile(_luaContext, temp)) utilDie("%s", lua_tostring(_luaContext, -1)); + free(temp); + // Parse results + lua_getglobal(_luaContext, "DEAD_ZONEX"); + if (lua_isnumber(_luaContext, -1)) { + _controllerDeadZone = (int32_t)lua_tonumber(_luaContext, -1); + } + lua_pop(_luaContext, 1); + for (x=0; x 0) { + _controlMappings[x].inputCount = y; + _controlMappings[x].input = (int32_t *)malloc(sizeof(int32_t) * y); + if (!_controlMappings[x].input) utilDie("Unable to allocate memory for control mappings."); + } + } else { + utilSay("Configuration option %s missing!", _controlMappings[x].name); + } + lua_pop(_luaContext, 1); + // Then load them for real. + lua_getglobal(_luaContext, _controlMappings[x].name); + if (lua_istable(_luaContext, -1)) { + lua_pushnil(_luaContext); + y = 0; + while (lua_next(_luaContext, -2)) { + _controlMappings[x].input[y++] = (int32_t)lua_tonumber(_luaContext, -1); + lua_pop(_luaContext, 1); + } + } + lua_pop(_luaContext, 1); + } + lua_close(_luaContext); + + // Show splash screens if (!_confNoConsole) { doLogos(); } - // Start Lua + // Start Lua for game _luaContext = luaL_newstate(); luaL_openlibs(_luaContext); lua_atpanic(_luaContext, luaError); diff --git a/singe/singe.pro b/singe/singe.pro index 378f772e6..73ab091d4 100644 --- a/singe/singe.pro +++ b/singe/singe.pro @@ -123,6 +123,7 @@ dynamic { HEADERS += \ $$ARGPARSER_HEADERS \ $$MANYMOUSE_HEADERS \ + Framework_singe.h \ frameFile.h \ stddclmr.h \ thirdparty/uthash.h \ @@ -136,7 +137,8 @@ HEADERS += \ kangarooPunchLogo.h \ laserDisc.h \ magnifyingGlass.h \ - indexing.h + indexing.h \ + controls_cfg.h SOURCES += \ $$ARGPARSER_SOURCES \