//----------------------------------------------------------------------------- // Pre-init //----------------------------------------------------------------------------- bool CVConfigApp::PreInit() { if ( !BaseClass::PreInit() ) return false; // Create a window to capture messages CreateMessageWindow(); // Make sure we're using the proper environment variable ConvertObsoleteVConfigRegistrySetting( GAMEDIR_TOKEN ); FileSystem_SetErrorMode( FS_ERRORMODE_AUTO ); // We only want to use the gameinfo.txt that is in the bin\vconfig directory. char dirName[MAX_PATH]; Q_strncpy( dirName, GetBaseDirectory(), sizeof( dirName ) ); Q_AppendSlash( dirName, sizeof( dirName ) ); Q_strncat( dirName, "vconfig", sizeof( dirName ), COPY_ALL_CHARACTERS ); if ( !SetupSearchPaths( dirName, true, true ) ) { ::MessageBox( NULL, "Error", "Unable to initialize file system\n", MB_OK ); return false; } // Load our configs if ( g_ConfigManager.LoadConfigs() == false ) { ::MessageBox( NULL, "Error", "Unable to load configuration file\n", MB_OK ); return false; } // Parse them for internal use if ( ParseConfigs() == false ) { ::MessageBox( NULL, "Error", "Unable to parse configuration file\n", MB_OK ); return false; } // Start looking for file updates UpdateConfigsStatus_Init(); // the "base dir" so we can scan mod name g_pFullFileSystem->AddSearchPath( GetBaseDirectory(), VCONFIG_MAIN_PATH_ID ); // the main platform dir g_pFullFileSystem->AddSearchPath( "platform","PLATFORM", PATH_ADD_TO_HEAD ); return true; }
int FileSystem_AddFallbackGameDir(const char *pGameDir) { char language[128]; const char * pchLang = CRehldsPlatformHolder::get()->SteamApps() ? CRehldsPlatformHolder::get()->SteamApps()->GetCurrentGameLanguage() : NULL; Q_strncpy(language, pchLang ? pchLang : "english", ARRAYSIZE(language)); #ifdef REHLDS_CHECKS language[ARRAYSIZE(language) - 1] = 0; #endif if (Q_strlen(language) != 0 && Q_stricmp(language, "english")) { char temp[MAX_PATH]; Q_sprintf(temp, "%s/%s_%s", GetBaseDirectory(), pGameDir, language); g_pFileSystem->AddSearchPath(temp, "GAME"); } g_pFileSystem->AddSearchPath(pGameDir, "GAME"); return 1; }
//----------------------------------------------------------------------------- // Purpose: Startup our file watch //----------------------------------------------------------------------------- void UpdateConfigsStatus_Init( void ) { // Watch our config file for changes if ( g_dwChangeHandle == NULL) { char szConfigDir[MAX_PATH]; Q_strncpy( szConfigDir, GetBaseDirectory(), sizeof( szConfigDir ) ); g_dwChangeHandle = FindFirstChangeNotification( szConfigDir, // directory to watch false, // watch the subtree FILE_NOTIFY_CHANGE_LAST_WRITE ); // watch file and dir name changes if ( g_dwChangeHandle == INVALID_HANDLE_VALUE ) { // FIXME: Unable to watch the file } } }
// Commit //------------------------------------------------------------------------------ /*virtual*/ bool FunctionLibrary::Commit( NodeGraph & nodeGraph, const BFFIterator & funcStartIter ) const { // make sure all required variables are defined const BFFVariable * outputLib; const BFFVariable * compiler; const BFFVariable * compilerOptions; AStackString<> compilerOptionsDeoptimized; AStackString<> compilerOutputPath; AStackString<> compilerOutputPrefix; const BFFVariable * compilerOutputExtension; const BFFVariable * librarian; const BFFVariable * librarianOptions; if ( !GetString( funcStartIter, outputLib, ".LibrarianOutput", true ) || !GetString( funcStartIter, compiler, ".Compiler", true ) || !GetString( funcStartIter, compilerOptions, ".CompilerOptions", true ) || !GetString( funcStartIter, compilerOptionsDeoptimized, ".CompilerOptionsDeoptimized", false ) || !GetString( funcStartIter, compilerOutputPath, ".CompilerOutputPath", true ) || !GetString( funcStartIter, compilerOutputPrefix, ".CompilerOutputPrefix", false ) || !GetString( funcStartIter, compilerOutputExtension, ".CompilerOutputExtension", false ) || !GetString( funcStartIter, librarian, ".Librarian", true ) || !GetString( funcStartIter, librarianOptions, ".LibrarianOptions", true ) ) { return false; } PathUtils::FixupFolderPath( compilerOutputPath ); // find or create the compiler node CompilerNode * compilerNode = nullptr; if ( !FunctionObjectList::GetCompilerNode( nodeGraph, funcStartIter, compiler->GetString(), compilerNode ) ) { return false; // GetCompilerNode will have emitted error } // Compiler Force Using Dependencies compilerForceUsing; if ( !GetNodeList( nodeGraph, funcStartIter, ".CompilerForceUsing", compilerForceUsing, false ) ) { return false; // GetNodeList will have emitted an error } // de-optimization setting bool deoptimizeWritableFiles = false; bool deoptimizeWritableFilesWithToken = false; if ( !GetBool( funcStartIter, deoptimizeWritableFiles, ".DeoptimizeWritableFiles", false, false ) ) { return false; // GetBool will have emitted error } if ( !GetBool( funcStartIter, deoptimizeWritableFilesWithToken, ".DeoptimizeWritableFilesWithToken", false, false ) ) { return false; // GetBool will have emitted error } if ( ( deoptimizeWritableFiles || deoptimizeWritableFilesWithToken ) && compilerOptionsDeoptimized.IsEmpty() ) { Error::Error_1101_MissingProperty( funcStartIter, this, AStackString<>( ".CompilerOptionsDeoptimized" ) ); return false; } // cache & distribution control bool allowDistribution( true ); bool allowCaching( true ); if ( !GetBool( funcStartIter, allowDistribution, ".AllowDistribution", true ) || !GetBool( funcStartIter, allowCaching, ".AllowCaching", true ) ) { return false; // GetBool will have emitted error } // Precompiled Header support ObjectNode * precompiledHeaderNode = nullptr; AStackString<> compilerOutputExtensionStr( compilerOutputExtension ? compilerOutputExtension->GetString().Get() : ".obj" ); if ( !GetPrecompiledHeaderNode( nodeGraph, funcStartIter, compilerNode, compilerOptions, compilerForceUsing, precompiledHeaderNode, deoptimizeWritableFiles, deoptimizeWritableFilesWithToken, allowDistribution, allowCaching, compilerOutputExtensionStr ) ) { return false; // GetPrecompiledHeaderNode will have emitted error } // Sanity check compile flags const bool usingPCH = ( precompiledHeaderNode != nullptr ); uint32_t objFlags = ObjectNode::DetermineFlags( compilerNode, compilerOptions->GetString(), false, usingPCH ); if ( ( objFlags & ObjectNode::FLAG_MSVC ) && ( objFlags & ObjectNode::FLAG_CREATING_PCH ) ) { // must not specify use of precompiled header (must use the PCH specific options) Error::Error_1303_PCHCreateOptionOnlyAllowedOnPCH( funcStartIter, this, "Yc", "CompilerOptions" ); return false; } // Check input/output for Compiler { bool hasInputToken = false; bool hasOutputToken = false; bool hasCompileToken = false; const AString & args = compilerOptions->GetString(); Array< AString > tokens; args.Tokenize( tokens ); for ( const AString & token : tokens ) { if ( token.Find( "%1" ) ) { hasInputToken = true; } else if ( token.Find( "%2" ) ) { hasOutputToken = true; } else { if ( objFlags & ObjectNode::FLAG_MSVC ) { if ( ( token == "/c" ) || ( token == "-c" ) ) { hasCompileToken = true; } } else { if ( token == "-c" ) { hasCompileToken = true; } } } } if ( hasInputToken == false ) { Error::Error_1106_MissingRequiredToken( funcStartIter, this, ".CompilerOptions", "%1" ); return false; } if ( hasOutputToken == false ) { Error::Error_1106_MissingRequiredToken( funcStartIter, this, ".CompilerOptions", "%2" ); return false; } // check /c or -c if ( objFlags & ObjectNode::FLAG_MSVC ) { if ( hasCompileToken == false ) { Error::Error_1106_MissingRequiredToken( funcStartIter, this, ".CompilerOptions", "/c or -c" ); return false; } } else if ( objFlags & ( ObjectNode::FLAG_SNC | ObjectNode::FLAG_GCC | ObjectNode::FLAG_CLANG ) ) { if ( hasCompileToken == false ) { Error::Error_1106_MissingRequiredToken( funcStartIter, this, ".CompilerOptions", "-c" ); return false; } } } // Check input/output for Librarian { const AString & args = librarianOptions->GetString(); bool hasInputToken = ( args.Find( "%1" ) || args.Find( "\"%1\"" ) ); if ( hasInputToken == false ) { Error::Error_1106_MissingRequiredToken( funcStartIter, this, ".LibrarianOptions", "%1" ); return false; } bool hasOutputToken = ( args.Find( "%2" ) || args.Find( "\"%2\"" ) ); if ( hasOutputToken == false ) { Error::Error_1106_MissingRequiredToken( funcStartIter, this, ".LibrarianOptions", "%2" ); return false; } } // Get the (optional) Preprocessor & PreprocessorOptions const BFFVariable * preprocessor = nullptr; const BFFVariable * preprocessorOptions = nullptr; CompilerNode * preprocessorNode = nullptr; if ( !GetString( funcStartIter, preprocessor, ".Preprocessor", false ) ) { return false; // GetString will have emitted an error } if ( preprocessor ) { // get the preprocessor executable if ( !FunctionObjectList::GetCompilerNode( nodeGraph, funcStartIter, preprocessor->GetString(), preprocessorNode ) ) { return false; // GetCompilerNode will have emitted an error } // get the command line args for the preprocessor if ( !GetString( funcStartIter, preprocessorOptions, ".PreprocessorOptions", true ) ) // required { return false; // GetString will have emitted an error } } // Pre-build dependencies Dependencies preBuildDependencies; if ( !GetNodeList( nodeGraph, funcStartIter, ".PreBuildDependencies", preBuildDependencies, false ) ) { return false; // GetNodeList will have emitted an error } Dependencies staticDeps( 32, true ); if ( !GetInputs( nodeGraph, funcStartIter, staticDeps ) ) { return false; // GetStaticDeps will gave emitted error } // are the additional inputs to merge into the libaray? Dependencies additionalInputs; if ( !GetNodeList( nodeGraph, funcStartIter, ".LibrarianAdditionalInputs", additionalInputs, false ) ) { return false;// helper will emit error } if ( staticDeps.IsEmpty() && additionalInputs.IsEmpty() ) { Error::Error_1006_NothingToBuild( funcStartIter, this ); return false; } uint32_t flags = LibraryNode::DetermineFlags( librarian->GetString() ); // Create library node which depends on the single file or list if ( nodeGraph.FindNode( outputLib->GetString() ) ) { Error::Error_1100_AlreadyDefined( funcStartIter, this, outputLib->GetString() ); return false; } AStackString<> baseDirectory; if ( !GetBaseDirectory( funcStartIter, baseDirectory ) ) { return false; // GetBaseDirectory will have emitted error } AStackString<> extraPDBPath, extraASMPath; GetExtraOutputPaths( compilerOptions->GetString(), extraPDBPath, extraASMPath ); LibraryNode * libNode = nodeGraph.CreateLibraryNode( outputLib->GetString(), staticDeps, compilerNode, compilerOptions->GetString(), compilerOptionsDeoptimized, compilerOutputPath, librarian->GetString(), librarianOptions->GetString(), flags, precompiledHeaderNode, compilerForceUsing, preBuildDependencies, additionalInputs, deoptimizeWritableFiles, deoptimizeWritableFilesWithToken, allowDistribution, allowCaching, preprocessorNode, preprocessorOptions ? preprocessorOptions->GetString() : AString::GetEmpty(), baseDirectory ); if ( compilerOutputExtension ) { libNode->m_ObjExtensionOverride = compilerOutputExtension->GetString(); } libNode->m_CompilerOutputPrefix = compilerOutputPrefix; libNode->m_ExtraPDBPath = extraPDBPath; libNode->m_ExtraASMPath = extraASMPath; return ProcessAlias( nodeGraph, funcStartIter, libNode ); }
int main(int argc,char *argv[]) { char *t; if(timeBeginPeriod(1)!=TIMERR_NOERROR) { AddLogText("Error setting timer granularity to 1ms.",1); } if(!FCEUI_Initialize()) goto doexito; srand(GetTickCount()); // rand() is used for some GUI sillyness. fceu_hInstance=GetModuleHandle(0); GetBaseDirectory(); sprintf(TempArray,"%s\\fceu98.cfg",BaseDirectory); LoadConfig(TempArray); t=ParseArgies(argc,argv); /* Bleh, need to find a better place for this. */ { palyo&=1; FCEUI_SetVidSystem(palyo); genie&=1; FCEUI_SetGameGenie(genie); fullscreen&=1; soundo&=1; FCEUI_SetSoundVolume(soundvolume); FCEUI_SetSoundQuality(soundquality); } ParseGIInput(NULL); /* Since a game doesn't have to be loaded before the GUI can be used, make sure the temporary input type variables are set. */ CreateDirs(); SetDirs(); DoVideoConfigFix(); DoTimingConfigFix(); if(eoptions&EO_CPALETTE) FCEUI_SetPaletteArray(cpalette); if(!t) fullscreen=0; CreateMainWindow(); if(!InitDInput()) goto doexito; if(!DriverInitialize()) goto doexito; InitSpeedThrottle(); UpdateMenu(); if(t) ALoad(t); else if(eoptions&EO_FOAFTERSTART) LoadNewGamey(hAppWnd, 0); doloopy: UpdateFCEUWindow(); if(GI) { while(GI) { uint8 *gfx; int32 *sound; int32 ssize; FCEUI_Emulate(&gfx, &sound, &ssize, 0); xbsave = gfx; FCEUD_Update(gfx, sound, ssize); } xbsave = NULL; RedrawWindow(hAppWnd,0,0,RDW_ERASE|RDW_INVALIDATE); StopSound(); } Sleep(50); if(!exiting) goto doloopy; doexito: DriverKill(); timeEndPeriod(1); FCEUI_Kill(); return(0); }
int FileSystem_SetGameDirectory(const char *pDefaultDir, const char *pGameDir) { char temp[512]; char language[256]; const char *pchLang; g_pFileSystem->RemoveAllSearchPaths(); language[0] = 0; if (!bLowViolenceBuild) { if (CRehldsPlatformHolder::get()->SteamApps() && GetGameAppID() == 70) { bLowViolenceBuild = CRehldsPlatformHolder::get()->SteamApps()->BIsLowViolence(); } } pchLang = CRehldsPlatformHolder::get()->SteamApps() ? CRehldsPlatformHolder::get()->SteamApps()->GetCurrentGameLanguage() : NULL; Q_strncpy(language, pchLang ? pchLang : "english", ARRAYSIZE(language)); #ifdef REHLDS_CHECKS language[ARRAYSIZE(language) - 1] = 0; #endif if (!g_bIsDedicatedServer && !IsGameSubscribed(pGameDir)) return 0; CRehldsPlatformHolder::get()->SteamAPI_SetBreakpadAppID(GetGameAppID()); bool bEnableHDPack = BEnabledHDAddon(); bool bLanguage = (Q_strlen(language) != 0 && Q_stricmp(language, "english")) ? true : false; if (!pGameDir) pGameDir = pDefaultDir; if (pGameDir) { if (bLowViolenceBuild) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_lv", GetBaseDirectory(), pGameDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "GAME"); } if (BEnableAddonsFolder()) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_addon", GetBaseDirectory(), pGameDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "GAME"); } if (bLanguage) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_%s", GetBaseDirectory(), pGameDir, language); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "GAME"); if (!COM_CheckParm("-steam")) { char baseDir[MAX_PATH]; Q_strncpy(baseDir, GetBaseDirectory(), sizeof(baseDir) - 1); baseDir[sizeof(baseDir) - 1] = 0; char* tempPtr = Q_strstr(baseDir, "\\game"); if (tempPtr) { *tempPtr = 0; Q_snprintf(temp, 511, "%s\\localization\\%s_%s", baseDir, pGameDir, language); temp[511] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "GAME"); } } } if (bEnableHDPack) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_hd", GetBaseDirectory(), pGameDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "GAME"); } Q_snprintf(temp, 511, "%s/%s", GetBaseDirectory(), pGameDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPath(temp, "GAME"); g_pFileSystem->AddSearchPath(temp, "GAMECONFIG"); Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_downloads", GetBaseDirectory(), pGameDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPath(temp, "GAMEDOWNLOAD"); CheckLiblistForFallbackDir(pGameDir, bLanguage, language, bLowViolenceBuild); } if (bLanguage) { if (bLowViolenceBuild) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_lv", GetBaseDirectory(), pDefaultDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "DEFAULTGAME"); } if (BEnableAddonsFolder()) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_addon", GetBaseDirectory(), pDefaultDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "DEFAULTGAME"); } Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_%s", GetBaseDirectory(), pDefaultDir, language); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "DEFAULTGAME"); if (!COM_CheckParm("-steam")) { char baseDir[MAX_PATH]; Q_strncpy(baseDir, GetBaseDirectory(), sizeof(baseDir) - 1); baseDir[sizeof(baseDir) - 1] = 0; char* tempPtr = Q_strstr(baseDir, "\\game"); if (tempPtr) { *tempPtr = 0; Q_snprintf(temp, sizeof(temp) - 1, "%s\\localization\\%s_%s", baseDir, pDefaultDir, language); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "DEFAULTGAME"); } } } if (bEnableHDPack) { Q_snprintf(temp, sizeof(temp) - 1, "%s/%s_hd", GetBaseDirectory(), pDefaultDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "DEFAULTGAME"); } Q_snprintf(temp, sizeof(temp) - 1, "%s", GetBaseDirectory()); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPath(temp, "BASE"); Q_snprintf(temp, sizeof(temp) - 1, "%s/%s", GetBaseDirectory(), pDefaultDir); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPathNoWrite(temp, "DEFAULTGAME"); Q_snprintf(temp, sizeof(temp) - 1, "%s/platform", GetBaseDirectory()); temp[sizeof(temp) - 1] = 0; COM_FixSlashes(temp); g_pFileSystem->AddSearchPath(temp, "PLATFORM"); return 1; }
void CheckLiblistForFallbackDir(const char *pGameDir, bool bLanguage, const char *pLanguage, bool bLowViolenceBuild_) { char szTemp[512]; FileHandle_t hFile; Q_snprintf(szTemp, sizeof(szTemp) - 1, "%s/liblist.gam", pGameDir); COM_FixSlashes(szTemp); g_pFileSystem->GetLocalCopy(szTemp); if (Q_stricmp(com_gamedir, pGameDir)) { Q_snprintf(szTemp, 511, "../%s/liblist.gam", pGameDir); COM_FixSlashes(szTemp); hFile = FS_Open(szTemp, "rt"); } else hFile = FS_Open("liblist.gam", "rt"); if (!hFile) return; if (FS_EndOfFile(hFile)) { FS_Close(hFile); return; } char szFallback[128]; char szLine[512]; char *end; char *start; int bytesToCopy; while (1) { szLine[0] = 0; FS_ReadLine(szLine, sizeof(szLine) - 1, hFile); szLine[511] = 0; if (!Q_strnicmp(szLine, "fallback_dir", Q_strlen("fallback_dir"))) { start = Q_strchr(szLine, '"'); if (!start) { FS_Close(hFile); return; } end = Q_strchr(start + 1, '"'); if (!end) { FS_Close(hFile); return; } bytesToCopy = (int)(end - start) - 1; if (bytesToCopy > sizeof(szFallback) - 2) { FS_Close(hFile); return; } if (bytesToCopy > 0) break; } if (FS_EndOfFile(hFile)) { FS_Close(hFile); return; } } Q_strncpy(szFallback, start + 1, bytesToCopy); szFallback[bytesToCopy] = 0; if (!Q_stricmp(pGameDir, szFallback) ) { FS_Close(hFile); return; } if (bLowViolenceBuild) { Q_snprintf(szTemp, 511, "%s/%s_lv", GetBaseDirectory(), szFallback); szTemp[511] = 0; COM_FixSlashes(szTemp); g_pFileSystem->AddSearchPathNoWrite(szTemp, "GAME_FALLBACK"); } if (BEnableAddonsFolder()) { Q_snprintf(szTemp, 511, "%s/%s_addon", GetBaseDirectory(), szFallback); szTemp[511] = 0; COM_FixSlashes(szTemp); g_pFileSystem->AddSearchPathNoWrite(szTemp, "GAME_FALLBACK"); } if (bLanguage && pLanguage) { char baseDir[4096]; char *tempPtr; Q_snprintf(szTemp, 511, "%s/%s_%s", GetBaseDirectory(), szFallback, pLanguage); szTemp[511] = 0; COM_FixSlashes(szTemp); g_pFileSystem->AddSearchPath(szTemp, "GAME_FALLBACK"); if (!COM_CheckParm("-steam")) { Q_strncpy(baseDir, GetBaseDirectory(), sizeof(baseDir) - 1); baseDir[sizeof(baseDir) - 1] = 0; tempPtr = Q_strstr(baseDir, "\\game"); if (tempPtr) { *tempPtr = 0; Q_snprintf(szTemp, 511, "%s\\localization\\%s_%s", baseDir, szFallback, pLanguage); szTemp[511] = 0; COM_FixSlashes(szTemp); g_pFileSystem->AddSearchPath(szTemp, "GAME_FALLBACK"); } } } if (BEnabledHDAddon()) { Q_snprintf(szTemp, 511, "%s/%s_hd", GetBaseDirectory(), szFallback); szTemp[511] = 0; COM_FixSlashes(szTemp); g_pFileSystem->AddSearchPathNoWrite(szTemp, "GAME_FALLBACK"); } Q_snprintf(szTemp, 511, "%s/%s", GetBaseDirectory(), szFallback); szTemp[511] = 0; COM_FixSlashes(szTemp); g_pFileSystem->AddSearchPath(szTemp, "GAME_FALLBACK"); if (Q_stricmp(szFallback, "valve")) { const int BufLen = 128; char *szFileName = new char[BufLen]; Q_snprintf(szFileName, BufLen - 1, "Resource/%s_%%language%%.txt", szFallback); szFileName[BufLen - 1] = 0; g_fallbackLocalizationFiles.AddToTail(szFileName); CheckLiblistForFallbackDir(szFallback, bLanguage, pLanguage, bLowViolenceBuild); } FS_Close(hFile); }
// returns a config structure with default options // also creates config base directory (ie: /home/user/.fceux as well as subdirs Config* InitConfig() { std::string dir, prefix; Config *config; GetBaseDirectory(dir); FCEUI_SetBaseDirectory(dir.c_str()); CreateDirs(dir); config = new Config(dir); // TODO: tsone: network play is disabled #if 0 // network play options - netplay is broken config->addOption("server", "SDL.NetworkIsServer", 0); config->addOption('n', "net", "SDL.NetworkIP", ""); config->addOption('u', "user", "SDL.NetworkUsername", ""); config->addOption('w', "pass", "SDL.NetworkPassword", ""); config->addOption('k', "netkey", "SDL.NetworkGameKey", ""); config->addOption("port", "SDL.NetworkPort", 4046); config->addOption("players", "SDL.NetworkPlayers", 1); #endif // TODO: tsone: fc extension port peripherals support #if PERI // PowerPad 0 - 1 for(unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++) { char buf[64]; snprintf(buf, 20, "SDL.Input.PowerPad.%d.", i); prefix = buf; config->addOption(prefix + "DeviceType", DefaultPowerPadDevice[i]); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < POWERPAD_NUM_BUTTONS; j++) { config->addOption(prefix +PowerPadNames[j], DefaultPowerPad[i][j]); } } // QuizKing prefix = "SDL.Input.QuizKing."; config->addOption(prefix + "DeviceType", DefaultQuizKingDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < QUIZKING_NUM_BUTTONS; j++) { config->addOption(prefix + QuizKingNames[j], DefaultQuizKing[j]); } // HyperShot prefix = "SDL.Input.HyperShot."; config->addOption(prefix + "DeviceType", DefaultHyperShotDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < HYPERSHOT_NUM_BUTTONS; j++) { config->addOption(prefix + HyperShotNames[j], DefaultHyperShot[j]); } // Mahjong prefix = "SDL.Input.Mahjong."; config->addOption(prefix + "DeviceType", DefaultMahjongDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < MAHJONG_NUM_BUTTONS; j++) { config->addOption(prefix + MahjongNames[j], DefaultMahjong[j]); } // TopRider prefix = "SDL.Input.TopRider."; config->addOption(prefix + "DeviceType", DefaultTopRiderDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < TOPRIDER_NUM_BUTTONS; j++) { config->addOption(prefix + TopRiderNames[j], DefaultTopRider[j]); } // FTrainer prefix = "SDL.Input.FTrainer."; config->addOption(prefix + "DeviceType", DefaultFTrainerDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < FTRAINER_NUM_BUTTONS; j++) { config->addOption(prefix + FTrainerNames[j], DefaultFTrainer[j]); } // FamilyKeyBoard prefix = "SDL.Input.FamilyKeyBoard."; config->addOption(prefix + "DeviceType", DefaultFamilyKeyBoardDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < FAMILYKEYBOARD_NUM_BUTTONS; j++) { config->addOption(prefix + FamilyKeyBoardNames[j], DefaultFamilyKeyBoard[j]); } // All mouse devices config->addOption("SDL.OekaKids.0.DeviceType", "Mouse"); config->addOption("SDL.OekaKids.0.DeviceNum", 0); config->addOption("SDL.Arkanoid.0.DeviceType", "Mouse"); config->addOption("SDL.Arkanoid.0.DeviceNum", 0); config->addOption("SDL.Shadow.0.DeviceType", "Mouse"); config->addOption("SDL.Shadow.0.DeviceNum", 0); config->addOption("SDL.Zapper.0.DeviceType", "Mouse"); config->addOption("SDL.Zapper.0.DeviceNum", 0); #endif return config; }
Config * InitConfig() { std::string dir, prefix; Config *config; GetBaseDirectory(dir); FCEUI_SetBaseDirectory(dir.c_str()); CreateDirs(dir); config = new Config(dir); // sound options config->addOption('s', "sound", "SDL.Sound", 1); config->addOption("volume", "SDL.Sound.Volume", 150); config->addOption("trianglevol", "SDL.Sound.TriangleVolume", 256); config->addOption("square1vol", "SDL.Sound.Square1Volume", 256); config->addOption("square2vol", "SDL.Sound.Square2Volume", 256); config->addOption("noisevol", "SDL.Sound.NoiseVolume", 256); config->addOption("pcmvol", "SDL.Sound.PCMVolume", 256); config->addOption("soundrate", "SDL.Sound.Rate", 44100); config->addOption("soundq", "SDL.Sound.Quality", 1); config->addOption("soundrecord", "SDL.Sound.RecordFile", ""); config->addOption("soundbufsize", "SDL.Sound.BufSize", 128); config->addOption("lowpass", "SDL.Sound.LowPass", 0); config->addOption('g', "gamegenie", "SDL.GameGenie", 0); config->addOption("pal", "SDL.PAL", 0); config->addOption("frameskip", "SDL.Frameskip", 0); config->addOption("clipsides", "SDL.ClipSides", 0); config->addOption("nospritelim", "SDL.DisableSpriteLimit", 1); // color control config->addOption('p', "palette", "SDL.Palette", ""); config->addOption("tint", "SDL.Tint", 56); config->addOption("hue", "SDL.Hue", 72); config->addOption("ntsccolor", "SDL.NTSCpalette", 0); // scanline settings config->addOption("slstart", "SDL.ScanLineStart", 0); config->addOption("slend", "SDL.ScanLineEnd", 239); // video controls config->addOption('x', "xres", "SDL.XResolution", 512); config->addOption('y', "yres", "SDL.YResolution", 448); config->addOption('f', "fullscreen", "SDL.Fullscreen", 0); config->addOption('b', "bpp", "SDL.BitsPerPixel", 32); config->addOption("doublebuf", "SDL.DoubleBuffering", 0); config->addOption("autoscale", "SDL.AutoScale", 1); config->addOption("keepratio", "SDL.KeepRatio", 1); config->addOption("xscale", "SDL.XScale", 1.0); config->addOption("yscale", "SDL.YScale", 1.0); config->addOption("xstretch", "SDL.XStretch", 0); config->addOption("ystretch", "SDL.YStretch", 0); config->addOption("noframe", "SDL.NoFrame", 0); config->addOption("special", "SDL.SpecialFilter", 0); // OpenGL options config->addOption("opengl", "SDL.OpenGL", 0); config->addOption("openglip", "SDL.OpenGLip", 0); config->addOption("SDL.SpecialFilter", 0); config->addOption("SDL.SpecialFX", 0); // network play options - netplay is broken config->addOption("server", "SDL.NetworkIsServer", 0); config->addOption('n', "net", "SDL.NetworkIP", ""); config->addOption('u', "user", "SDL.NetworkUsername", ""); config->addOption('w', "pass", "SDL.NetworkPassword", ""); config->addOption('k', "netkey", "SDL.NetworkGameKey", ""); config->addOption("port", "SDL.NetworkPort", 4046); config->addOption("players", "SDL.NetworkPlayers", 1); // input configuration options config->addOption("input1", "SDL.Input.0", "GamePad.0"); config->addOption("input2", "SDL.Input.1", "GamePad.1"); config->addOption("input3", "SDL.Input.2", "Gamepad.2"); config->addOption("input4", "SDL.Input.3", "Gamepad.3"); // allow for input configuration config->addOption('i', "inputcfg", "SDL.InputCfg", InputCfg); // display input config->addOption("inputdisplay", "SDL.InputDisplay", 0); // pause movie playback at frame x config->addOption("pauseframe", "SDL.PauseFrame", 0); config->addOption("moviemsg", "SDL.MovieMsg", 1); // overwrite the config file? config->addOption("no-config", "SDL.NoConfig", 0); // video playback config->addOption("playmov", "SDL.Movie", ""); config->addOption("subtitles", "SDL.SubtitleDisplay", 1); config->addOption("fourscore", "SDL.FourScore", 0); #ifdef _S9XLUA_H // load lua script config->addOption("loadlua", "SDL.LuaScript", ""); #endif #ifdef CREATE_AVI config->addOption("videolog", "SDL.VideoLog", ""); config->addOption("mute", "SDL.MuteCapture", 0); #endif #ifdef _GTK char* home_dir = getenv("HOME"); // prefixed with _ because they are internal (not cli options) config->addOption("_lastopenfile", "SDL.LastOpenFile", home_dir); config->addOption("_laststatefrom", "SDL.LastLoadStateFrom", home_dir); config->addOption("_lastopennsf", "SDL.LastOpenNSF", home_dir); config->addOption("_lastsavestateas", "SDL.LastSaveStateAs", home_dir); // option to disable gui (broken??) config->addOption("nogui", "SDL.NoGUI", 0); #endif // fcm -> fm2 conversion config->addOption("fcmconvert", "SDL.FCMConvert", ""); // fm2 -> srt conversion config->addOption("ripsubs", "SDL.RipSubs", ""); // enable new PPU core config->addOption("newppu", "SDL.NewPPU", 0); // GamePad 0 - 3 for(unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++) { char buf[64]; snprintf(buf, 20, "SDL.Input.GamePad.%d.", i); prefix = buf; config->addOption(prefix + "DeviceType", DefaultGamePadDevice[i]); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < GAMEPAD_NUM_BUTTONS; j++) { config->addOption(prefix + GamePadNames[j], DefaultGamePad[i][j]); } } // PowerPad 0 - 1 for(unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++) { char buf[64]; snprintf(buf, 20, "SDL.Input.PowerPad.%d.", i); prefix = buf; config->addOption(prefix + "DeviceType", DefaultPowerPadDevice[i]); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < POWERPAD_NUM_BUTTONS; j++) { config->addOption(prefix +PowerPadNames[j], DefaultPowerPad[i][j]); } } // QuizKing prefix = "SDL.Input.QuizKing."; config->addOption(prefix + "DeviceType", DefaultQuizKingDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < QUIZKING_NUM_BUTTONS; j++) { config->addOption(prefix + QuizKingNames[j], DefaultQuizKing[j]); } // HyperShot prefix = "SDL.Input.HyperShot."; config->addOption(prefix + "DeviceType", DefaultHyperShotDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < HYPERSHOT_NUM_BUTTONS; j++) { config->addOption(prefix + HyperShotNames[j], DefaultHyperShot[j]); } // Mahjong prefix = "SDL.Input.Mahjong."; config->addOption(prefix + "DeviceType", DefaultMahjongDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < MAHJONG_NUM_BUTTONS; j++) { config->addOption(prefix + MahjongNames[j], DefaultMahjong[j]); } // TopRider prefix = "SDL.Input.TopRider."; config->addOption(prefix + "DeviceType", DefaultTopRiderDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < TOPRIDER_NUM_BUTTONS; j++) { config->addOption(prefix + TopRiderNames[j], DefaultTopRider[j]); } // FTrainer prefix = "SDL.Input.FTrainer."; config->addOption(prefix + "DeviceType", DefaultFTrainerDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < FTRAINER_NUM_BUTTONS; j++) { config->addOption(prefix + FTrainerNames[j], DefaultFTrainer[j]); } // FamilyKeyBoard prefix = "SDL.Input.FamilyKeyBoard."; config->addOption(prefix + "DeviceType", DefaultFamilyKeyBoardDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < FAMILYKEYBOARD_NUM_BUTTONS; j++) { config->addOption(prefix + FamilyKeyBoardNames[j], DefaultFamilyKeyBoard[j]); } // for FAMICOM microphone in pad 2 pad 1 didn't have it // Takeshi no Chousenjou uses it for example. prefix = "SDL.Input.FamicomPad2."; config->addOption("rp2mic", prefix + "EnableMic", 0); const int Hotkeys[HK_MAX] = { SDLK_F1, // cheat menu SDLK_F2, // bind state SDLK_F3, // load lua SDLK_F4, // toggleBG SDLK_F5, // save state SDLK_F6, // fds select SDLK_F7, // load state SDLK_F8, // fds eject SDLK_F6, // VS insert coin SDLK_F8, // VS toggle dipswitch SDLK_PERIOD, // toggle frame display SDLK_F10, // toggle subtitle SDLK_F11, // reset SDLK_F12, // screenshot SDLK_PAUSE, // pause SDLK_MINUS, // speed++ SDLK_EQUALS, // speed-- SDLK_BACKSLASH, //frame advnace SDLK_TAB, // turbo SDLK_COMMA, // toggle input display SDLK_q, // toggle movie RW SDLK_QUOTE, // toggle mute capture //SDLK_ESCAPE, // quit SDLK_DELETE, // frame advance lag skip SDLK_SLASH, // lag counter display SDLK_0, SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_5, SDLK_6, SDLK_7, SDLK_8, SDLK_9 }; prefix = "SDL.Hotkeys."; for(int i=0; i < HK_MAX; i++) config->addOption(prefix + HotkeyStrings[i], Hotkeys[i]); /* config->addOption(prefix + "Pause", SDLK_PAUSE); config->addOption(prefix + "DecreaseSpeed", SDLK_MINUS); config->addOption(prefix + "IncreaseSpeed", SDLK_EQUALS); config->addOption(prefix + "FrameAdvance", SDLK_BACKSLASH); config->addOption(prefix + "FastForward", SDLK_TAB); config->addOption(prefix + "InputDisplay", SDLK_i); config->addOption(prefix + "MovieToggleReadWrite", SDLK_q); #ifdef CREATE_AVI config->addOption(prefix + "MuteCapture", SDLK_DELETE); #endif config->addOption(prefix + "Quit", SDLK_ESCAPE); //config->addOption(prefix + "Power", 0); config->addOption(prefix + "SelectState0", SDLK_0); config->addOption(prefix + "SelectState1", SDLK_1); config->addOption(prefix + "SelectState2", SDLK_2); config->addOption(prefix + "SelectState3", SDLK_3); config->addOption(prefix + "SelectState4", SDLK_4); config->addOption(prefix + "SelectState5", SDLK_5); config->addOption(prefix + "SelectState6", SDLK_6); config->addOption(prefix + "SelectState7", SDLK_7); config->addOption(prefix + "SelectState8", SDLK_8); config->addOption(prefix + "SelectState9", SDLK_9); */ // All mouse devices config->addOption("SDL.OekaKids.0.DeviceType", "Mouse"); config->addOption("SDL.OekaKids.0.DeviceNum", 0); config->addOption("SDL.Arkanoid.0.DeviceType", "Mouse"); config->addOption("SDL.Arkanoid.0.DeviceNum", 0); config->addOption("SDL.Shadow.0.DeviceType", "Mouse"); config->addOption("SDL.Shadow.0.DeviceNum", 0); config->addOption("SDL.Zapper.0.DeviceType", "Mouse"); config->addOption("SDL.Zapper.0.DeviceNum", 0); return config; }
Config * InitConfig() { std::string dir, prefix; Config *config; GetBaseDirectory(dir); FCEUI_SetBaseDirectory(dir.c_str()); CreateDirs(dir); config = new Config(dir); // sound options config->addOption('s', "sound", "SDL.Sound", 1); config->addOption("volume", "SDL.Sound.Volume", 256); config->addOption("trianglevol", "SDL.Sound.TriangleVolume", 256); config->addOption("square1vol", "SDL.Sound.Square1Volume", 256); config->addOption("square2vol", "SDL.Sound.Square2Volume", 256); config->addOption("noisevol", "SDL.Sound.NoiseVolume", 256); config->addOption("pcmvol", "SDL.Sound.PCMVolume", 256); config->addOption("soundrate", "SDL.Sound.Rate", 32000); config->addOption("soundq", "SDL.Sound.Quality", 0); config->addOption("soundrecord", "SDL.Sound.RecordFile", ""); config->addOption("soundbufsize", "SDL.Sound.BufSize", 30); config->addOption("lowpass", "SDL.Sound.LowPass", 0); config->addOption('g', "gamegenie", "SDL.GameGenie", 0); config->addOption("pal", "SDL.PAL", 0); config->addOption("frameskip", "SDL.Frameskip", 0); config->addOption("clipsides", "SDL.ClipSides", 0); config->addOption("nospritelim", "SDL.DisableSpriteLimit", 1); // color control config->addOption('p', "palette", "SDL.Palette", ""); config->addOption("tint", "SDL.Tint", 56); config->addOption("hue", "SDL.Hue", 72); config->addOption("ntsccolor", "SDL.NTSCpalette", 0); // scanline settings config->addOption("slstart", "SDL.ScanLineStart", 0); config->addOption("slend", "SDL.ScanLineEnd", 239); // video controls config->addOption('x', "xres", "SDL.XResolution", 320); config->addOption('y', "yres", "SDL.YResolution", 240); config->addOption('f', "fullscreen", "SDL.Fullscreen", 0); config->addOption('b', "bpp", "SDL.BitsPerPixel", 8); config->addOption("doublebuf", "SDL.DoubleBuffering", 0); config->addOption("autoscale", "SDL.AutoScale", 1); config->addOption("keepratio", "SDL.KeepRatio", 1); config->addOption("xscale", "SDL.XScale", 1.0); config->addOption("yscale", "SDL.YScale", 1.0); config->addOption("xstretch", "SDL.XStretch", 0); config->addOption("ystretch", "SDL.YStretch", 0); config->addOption("noframe", "SDL.NoFrame", 0); config->addOption("special", "SDL.SpecialFilter", 0); // NOT SUPPORTED // OpenGL options //config->addOption("opengl", "SDL.OpenGL", 0); //config->addOption("openglip", "SDL.OpenGLip", 0); //config->addOption("SDL.SpecialFilter", 0); //config->addOption("SDL.SpecialFX", 0); // network play options - netplay is broken //config->addOption("server", "SDL.NetworkIsServer", 0); //config->addOption('n', "net", "SDL.NetworkIP", ""); //config->addOption('u', "user", "SDL.NetworkUsername", ""); //config->addOption('w', "pass", "SDL.NetworkPassword", ""); //config->addOption('k', "netkey", "SDL.NetworkGameKey", ""); //config->addOption("port", "SDL.NetworkPort", 4046); //config->addOption("players", "SDL.NetworkPlayers", 1); config->addOption("mousespeed", "SDL.MouseSpeed", 3); config->addOption("showmouse", "SDL.ShowMouseCursor", 0); config->addOption("fpsthottle", "SDL.FPSThrottle", 0); config->addOption("showfps", "SDL.ShowFPS", 0); // input configuration options config->addOption("input1", "SDL.Input.0", "GamePad.0"); config->addOption("input2", "SDL.Input.1", "GamePad.1"); config->addOption("input3", "SDL.Input.2", "Gamepad.2"); config->addOption("input4", "SDL.Input.3", "Gamepad.3"); // allow for input configuration // NOT SUPPORTED // config->addOption('i', "inputcfg", "SDL.InputCfg", InputCfg); // display input config->addOption("inputdisplay", "SDL.InputDisplay", 0); // pause movie playback at frame x config->addOption("pauseframe", "SDL.PauseFrame", 0); config->addOption("moviemsg", "SDL.MovieMsg", 1); // overwrite the config file? config->addOption("no-config", "SDL.NoConfig", 0); // video playback config->addOption("playmov", "SDL.Movie", ""); config->addOption("subtitles", "SDL.SubtitleDisplay", 1); config->addOption("fourscore", "SDL.FourScore", 0); #ifdef _S9XLUA_H // load lua script config->addOption("loadlua", "SDL.LuaScript", ""); #endif #ifdef CREATE_AVI config->addOption("videolog", "SDL.VideoLog", ""); config->addOption("mute", "SDL.MuteCapture", 0); #endif // fcm -> fm2 conversion config->addOption("fcmconvert", "SDL.FCMConvert", ""); // fm2 -> srt conversion config->addOption("ripsubs", "SDL.RipSubs", ""); // enable new PPU core config->addOption("newppu", "SDL.NewPPU", 0); // GamePad 0 - 3 for (unsigned int i = 0; i < GAMEPAD_NUM_DEVICES; i++) { char buf[64]; snprintf(buf, 20, "SDL.Input.GamePad.%d.", i); prefix = buf; config->addOption(prefix + "DeviceType", DefaultGamePadDevice[i]); config->addOption(prefix + "DeviceNum", 0); for (unsigned int j = 0; j < GAMEPAD_NUM_BUTTONS; j++) { config->addOption(prefix + GamePadNames[j], DefaultGamePad[i][j]); } } #if 0 // PowerPad 0 - 1 for(unsigned int i = 0; i < POWERPAD_NUM_DEVICES; i++) { char buf[64]; snprintf(buf, 20, "SDL.Input.PowerPad.%d.", i); prefix = buf; config->addOption(prefix + "DeviceType", DefaultPowerPadDevice[i]); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < POWERPAD_NUM_BUTTONS; j++) { config->addOption(prefix +PowerPadNames[j], DefaultPowerPad[i][j]); } } #endif // QuizKing prefix = "SDL.Input.QuizKing."; config->addOption(prefix + "DeviceType", DefaultQuizKingDevice); config->addOption(prefix + "DeviceNum", 0); for (unsigned int j = 0; j < QUIZKING_NUM_BUTTONS; j++) { config->addOption(prefix + QuizKingNames[j], DefaultQuizKing[j]); } // HyperShot prefix = "SDL.Input.HyperShot."; config->addOption(prefix + "DeviceType", DefaultHyperShotDevice); config->addOption(prefix + "DeviceNum", 0); for (unsigned int j = 0; j < HYPERSHOT_NUM_BUTTONS; j++) { config->addOption(prefix + HyperShotNames[j], DefaultHyperShot[j]); } #if 0 // Mahjong prefix = "SDL.Input.Mahjong."; config->addOption(prefix + "DeviceType", DefaultMahjongDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < MAHJONG_NUM_BUTTONS; j++) { config->addOption(prefix + MahjongNames[j], DefaultMahjong[j]); } #endif // TopRider prefix = "SDL.Input.TopRider."; config->addOption(prefix + "DeviceType", DefaultTopRiderDevice); config->addOption(prefix + "DeviceNum", 0); for (unsigned int j = 0; j < TOPRIDER_NUM_BUTTONS; j++) { config->addOption(prefix + TopRiderNames[j], DefaultTopRider[j]); } #if 0 // FTrainer prefix = "SDL.Input.FTrainer."; config->addOption(prefix + "DeviceType", DefaultFTrainerDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < FTRAINER_NUM_BUTTONS; j++) { config->addOption(prefix + FTrainerNames[j], DefaultFTrainer[j]); } // FamilyKeyBoard prefix = "SDL.Input.FamilyKeyBoard."; config->addOption(prefix + "DeviceType", DefaultFamilyKeyBoardDevice); config->addOption(prefix + "DeviceNum", 0); for(unsigned int j = 0; j < FAMILYKEYBOARD_NUM_BUTTONS; j++) { config->addOption(prefix + FamilyKeyBoardNames[j], DefaultFamilyKeyBoard[j]); } #endif // Will use R + Button combo for hotkeys on dingoo // So only 11 hotkeys available // L trigger will be saved for GUI const int Hotkeys[HK_MAX] = { -1, // cheat menu -1, // bind state -1, // load lua -1, // toggleBG 0, // save state 2, // fds flip disk -1, // fds select 1, // load state -1, // fds eject 5, // VS insert coin -1, // VS toggle dipswitch 6, // toggle frame display 27, // toggle subtitle -1, // reset 17, // screenshot 16, // pause -1, // speed++ -1, // speed-- 18, //frame advance -1, // turbo -1, // toggle input display -1, // toggle movie RW -1, // toggle mute capture 29, // quit -1, // frame advance lag skip -1, // lag counter display -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; prefix = "SDL.Hotkeys."; for (int i = 0; i < HK_MAX; i++) config->addOption(prefix + HotkeyStrings[i], Hotkeys[i]); // TODO - Are these necessary? /* config->addOption(prefix + "Pause", SDLK_PAUSE); config->addOption(prefix + "DecreaseSpeed", SDLK_MINUS); config->addOption(prefix + "IncreaseSpeed", SDLK_EQUALS); config->addOption(prefix + "FrameAdvance", SDLK_BACKSLASH); config->addOption(prefix + "FastForward", SDLK_TAB); config->addOption(prefix + "InputDisplay", SDLK_i); config->addOption(prefix + "MovieToggleReadWrite", SDLK_q); #ifdef CREATE_AVI config->addOption(prefix + "MuteCapture", SDLK_DELETE); #endif config->addOption(prefix + "Quit", SDLK_ESCAPE); //config->addOption(prefix + "Power", 0); */ /* NOT SUPPORTED config->addOption(prefix + "SelectState0", SDLK_0); config->addOption(prefix + "SelectState1", SDLK_1); config->addOption(prefix + "SelectState2", SDLK_2); config->addOption(prefix + "SelectState3", SDLK_3); config->addOption(prefix + "SelectState4", SDLK_4); config->addOption(prefix + "SelectState5", SDLK_5); config->addOption(prefix + "SelectState6", SDLK_6); config->addOption(prefix + "SelectState7", SDLK_7); config->addOption(prefix + "SelectState8", SDLK_8); config->addOption(prefix + "SelectState9", SDLK_9); */ // All mouse devices config->addOption("SDL.OekaKids.0.DeviceType", "Mouse"); config->addOption("SDL.OekaKids.0.DeviceNum", 0); config->addOption("SDL.Arkanoid.0.DeviceType", "Mouse"); config->addOption("SDL.Arkanoid.0.DeviceNum", 0); config->addOption("SDL.Shadow.0.DeviceType", "Mouse"); config->addOption("SDL.Shadow.0.DeviceNum", 0); config->addOption("SDL.Zapper.0.DeviceType", "Mouse"); config->addOption("SDL.Zapper.0.DeviceNum", 0); return config; }