diff --git a/src/driver.h b/src/driver.h index 728d881b..4baac10f 100644 --- a/src/driver.h +++ b/src/driver.h @@ -68,6 +68,7 @@ void FCEUI_SetNTSCTH(int n, int tint, int hue); void FCEUI_SetInput(int port, int type, void *ptr, int attrib); void FCEUI_SetInputFC(int type, void *ptr, int attrib); void FCEUI_DisableFourScore(int s); +void FCEUI_UseInputPreset(int preset); #define SI_NONE 0 #define SI_GAMEPAD 1 diff --git a/src/drivers/sdl/sdl.cpp b/src/drivers/sdl/sdl.cpp index 0342c48f..464ddd3a 100644 --- a/src/drivers/sdl/sdl.cpp +++ b/src/drivers/sdl/sdl.cpp @@ -481,4 +481,5 @@ DUMMY(FCEUD_AviStop) void FCEUI_AviVideoUpdate(const unsigned char* buffer) { } int FCEUD_ShowStatusIcon(void) {return 0;} int FCEUI_AviIsRecording(void) {return 0;} +void FCEUI_UseInputPreset(int preset) { } diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index 7934151e..ac9239ce 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -60,6 +60,8 @@ int InitDInput(void) } return 1; } +static void PresetExport(int preset); +static void PresetImport(int preset); static uint32 MouseData[3]; static int screenmode=0; @@ -148,7 +150,7 @@ int allowUDLR=1; ButtConfig GamePadConfig[4][10]={ /* Gamepad 1 */ - { + { MK(LEFTALT), MK(LEFTCONTROL), MK(TAB), MK(ENTER), MK(BL_CURSORUP), MK(BL_CURSORDOWN),MK(BL_CURSORLEFT),MK(BL_CURSORRIGHT) }, @@ -163,6 +165,11 @@ ButtConfig GamePadConfig[4][10]={ GPZ() }; +ButtConfig GamePadPreset1[4][10]={GPZ(),GPZ(),GPZ(),GPZ()}; +ButtConfig GamePadPreset2[4][10]={GPZ(),GPZ(),GPZ(),GPZ()}; +ButtConfig GamePadPreset3[4][10]={GPZ(),GPZ(),GPZ(),GPZ()}; +char *InputPresetDir = 0; + extern int rapidAlternator; // for auto-fire / autofire int DesynchAutoFire=0; // A and B not at same time uint32 JSAutoHeld=0, JSAutoHeldAffected=0; // for auto-hold @@ -583,6 +590,9 @@ CFGSTRUCT InputConfig[]={ AC(HyperShotButtons), AC(MahjongButtons), AC(GamePadConfig), + AC(GamePadPreset1), + AC(GamePadPreset2), + AC(GamePadPreset3), AC(fkbmap), AC(suborkbmap), ENDCFGSTRUCT @@ -1301,6 +1311,27 @@ BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara break; + case BTN_PRESET_SET1: + MessageBox(0, "Current input configuration has been set as Preset 1.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + memcpy(GamePadPreset1, GamePadConfig, sizeof(GamePadConfig)); + break; + case BTN_PRESET_SET2: + MessageBox(0, "Current input configuration has been set as Preset 2.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + memcpy(GamePadPreset2, GamePadConfig, sizeof(GamePadConfig)); + break; + case BTN_PRESET_SET3: + MessageBox(0, "Current input configuration has been set as Preset 3.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + memcpy(GamePadPreset3, GamePadConfig, sizeof(GamePadConfig)); + break; + + case BTN_PRESET_EXPORT1: PresetExport(1); break; + case BTN_PRESET_EXPORT2: PresetExport(2); break; + case BTN_PRESET_EXPORT3: PresetExport(3); break; + + case BTN_PRESET_IMPORT1: PresetImport(1); break; + case BTN_PRESET_IMPORT2: PresetImport(2); break; + case BTN_PRESET_IMPORT3: PresetImport(3); break; + case BTN_AUTO_HOLD: // auto-hold button { char btext[128] = { 0 }; @@ -1477,3 +1508,109 @@ void FCEUD_TurboOff(void) turbo = false; } +void FCEUI_UseInputPreset(int preset) +{ + switch(preset) + { + case 0: memcpy(GamePadConfig, GamePadPreset1, sizeof(GamePadPreset1)); break; + case 1: memcpy(GamePadConfig, GamePadPreset2, sizeof(GamePadPreset2)); break; + case 2: memcpy(GamePadConfig, GamePadPreset3, sizeof(GamePadPreset3)); break; + } + FCEU_DispMessage("Using input preset %d.",preset+1); +} + +static void PresetExport(int preset) +{ + const char filter[]="Input Preset File(*.pre)\0*.pre\0"; + char nameo[2048]; + OPENFILENAME ofn; + memset(&ofn,0,sizeof(ofn)); + ofn.lStructSize=sizeof(ofn); + ofn.hInstance=fceu_hInstance; + ofn.lpstrTitle="Export Input Preset To..."; + ofn.lpstrFilter=filter; + nameo[0]=0; + ofn.lpstrFile=nameo; + ofn.nMaxFile=256; + ofn.Flags=OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT; + ofn.lpstrInitialDir=InputPresetDir; + if(GetSaveFileName(&ofn)) + { + int i; + //Save the directory + if(ofn.nFileOffset < 1024) + { + free(InputPresetDir); + InputPresetDir=(char*)malloc(strlen(ofn.lpstrFile)+1); + strcpy(InputPresetDir,ofn.lpstrFile); + InputPresetDir[ofn.nFileOffset]=0; + } + + //quick get length of nameo + for(i=0;i<2048;i++) + { + if(nameo[i] == 0) + { + break; + } + } + + //add .pre if nameo doesn't have it + if((i < 4 || nameo[i-4] != '.') && i < 2040) + { + nameo[i] = '.'; + nameo[i+1] = 'p'; + nameo[i+2] = 'r'; + nameo[i+3] = 'e'; + nameo[i+4] = 0; + } + + FILE *fp=FCEUD_UTF8fopen(nameo,"w"); + switch(preset) + { + case 1: fwrite(GamePadPreset1,1,sizeof(GamePadPreset1),fp); break; + case 2: fwrite(GamePadPreset2,1,sizeof(GamePadPreset2),fp); break; + case 3: fwrite(GamePadPreset3,1,sizeof(GamePadPreset3),fp); break; + } + fclose(fp); + } +} + +static void PresetImport(int preset) +{ + const char filter[]="Input Preset File(*.pre)\0*.pre\0"; + char nameo[2048]; + OPENFILENAME ofn; + memset(&ofn,0,sizeof(ofn)); + ofn.lStructSize=sizeof(ofn); + ofn.hInstance=fceu_hInstance; + ofn.lpstrTitle="Import Input Preset......"; + ofn.lpstrFilter=filter; + nameo[0]=0; + ofn.lpstrFile=nameo; + ofn.nMaxFile=256; + ofn.Flags=OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; + ofn.lpstrInitialDir=InputPresetDir; + + if(GetOpenFileName(&ofn)) + { + //Save the directory + if(ofn.nFileOffset < 1024) + if(ofn.nFileOffset < 1024) + { + free(InputPresetDir); + InputPresetDir=(char*)malloc(strlen(ofn.lpstrFile)+1); + strcpy(InputPresetDir,ofn.lpstrFile); + InputPresetDir[ofn.nFileOffset]=0; + } + + FILE *fp=FCEUD_UTF8fopen(nameo,"r"); + switch(preset) + { + case 1: fread(GamePadPreset1,1,sizeof(GamePadPreset1),fp); break; + case 2: fread(GamePadPreset2,1,sizeof(GamePadPreset2),fp); break; + case 3: fread(GamePadPreset3,1,sizeof(GamePadPreset3),fp); break; + } + fclose(fp); + } +} diff --git a/src/input.cpp b/src/input.cpp index 4605b897..a60aad88 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -545,6 +545,7 @@ static void CommandMovieSelectSlot(void); static void CommandMovieRecord(void); static void CommandMovieReplay(void); static void CommandSoundAdjust(void); +static void CommandUsePreset(void); static void ViewSlots(void); struct EMUCMDTABLE FCEUI_CommandTable[]= @@ -666,7 +667,10 @@ struct EMUCMDTABLE FCEUI_CommandTable[]= { EMUCMD_VSUNI_TOGGLE_DIP_8, EMUCMDTYPE_VSUNI, CommandToggleDip, 0, 0, "Toggle Dipswitch 8", }, { EMUCMD_VSUNI_TOGGLE_DIP_9, EMUCMDTYPE_VSUNI, CommandToggleDip, 0, 0, "Toggle Dipswitch 9", }, { EMUCMD_MISC_REWIND, EMUCMDTYPE_MISC, FCEUI_Rewind, 0, 0, "Rewind", }, - { EMUCMD_MISC_SHOWSTATES, EMUCMDTYPE_MISC, ViewSlots, 0,0, "View save slots", }, + { EMUCMD_MISC_SHOWSTATES, EMUCMDTYPE_MISC, ViewSlots, 0,0, "View save slots", }, + { EMUCMD_MISC_USE_INPUT_PRESET_1, EMUCMDTYPE_MISC, CommandUsePreset, 0,0, "Use Input Preset 1", }, + { EMUCMD_MISC_USE_INPUT_PRESET_2, EMUCMDTYPE_MISC, CommandUsePreset, 0,0, "Use Input Preset 2", }, + { EMUCMD_MISC_USE_INPUT_PRESET_3, EMUCMDTYPE_MISC, CommandUsePreset, 0,0, "Use Input Preset 3", }, }; #define NUM_EMU_CMDS (sizeof(FCEUI_CommandTable)/sizeof(FCEUI_CommandTable[0])) @@ -794,3 +798,8 @@ static void CommandSoundAdjust(void) FCEUD_SoundVolumeAdjust(n); } + +static void CommandUsePreset(void) +{ + FCEUI_UseInputPreset(execcmd-EMUCMD_MISC_USE_INPUT_PRESET_1); +} diff --git a/src/input.h b/src/input.h index cc284e9b..4f5a8584 100644 --- a/src/input.h +++ b/src/input.h @@ -149,6 +149,9 @@ enum EMUCMD EMUCMD_VSUNI_TOGGLE_DIP_9, EMUCMD_MISC_REWIND, EMUCMD_MISC_SHOWSTATES, + EMUCMD_MISC_USE_INPUT_PRESET_1, + EMUCMD_MISC_USE_INPUT_PRESET_2, + EMUCMD_MISC_USE_INPUT_PRESET_3, EMUCMD_MAX };