#include #include #include #include #include #include #include #include "language/gettext.h" #include "listfiles.h" #include "xml/xml.h" /* XML - Lustar*/ #include "cfg.h" #define isspace2(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') struct SSettings Settings; char bootDevice[10] = "SD:"; struct CFG CFG; struct THEME THEME; u8 ocarinaChoice = 0; u8 videoChoice = 0; u8 faveChoice = no; u8 languageChoice = 0; u8 viChoice = 0; u8 iosChoice = 0; u8 parentalcontrolChoice = 0; u8 fix002 = 0; u8 reloadblock = 0; u8 countrystrings = 0; u8 alternatedol = 0; u32 alternatedoloffset = 0; u8 xflip = 0; u8 sort = 0; u8 fave = 0; u8 qboot = 0; u8 wsprompt = 0; u8 keyset = 0; u8 favoritevar = 0; u16 playcount = 0; u8 listDisplay = 0; u8 partition = -1; char alternatedname[40]; u8 returnToLoaderGV = 1; //global variable used for returnToLoaderShit. defaults to "yes, patch return to loader" struct ID_Title { char id[6]; char * title; }; struct ID_Control { char id[6]; u8 block; }; // renamed titles int num_title = 0; //number of titles struct ID_Title *cfg_title = NULL; int num_control = 0; struct ID_Control *cfg_control = NULL; #define MAX_SAVED_GAMES 1000 #define MAX_SAVED_GAME_NUM 1000 int num_saved_games = 0; int num_saved_game_num = 0; struct Game_CFG cfg_game[MAX_SAVED_GAMES]; struct Game_NUM cfg_game_num[MAX_SAVED_GAME_NUM]; /* For Mapping */ static char *cfg_name, *cfg_val; struct TextMap { char *name; int id; }; struct TextMap map_video[] = { { "system", CFG_VIDEO_SYS }, { "game", CFG_VIDEO_GAME }, { "patch", CFG_VIDEO_PATCH }, { "pal50", CFG_VIDEO_PAL50 }, { "pal60", CFG_VIDEO_PAL60 }, { "ntsc", CFG_VIDEO_NTSC }, { NULL, -1 } }; struct TextMap map_language[] = { { "console", CFG_LANG_CONSOLE }, { "japanese", CFG_LANG_JAPANESE }, { "english", CFG_LANG_ENGLISH }, { "german", CFG_LANG_GERMAN }, { "french", CFG_LANG_FRENCH }, { "spanish", CFG_LANG_SPANISH }, { "italian", CFG_LANG_ITALIAN }, { "dutch", CFG_LANG_DUTCH }, { "schinese", CFG_LANG_S_CHINESE }, // without a dot between s and chinese to match the language filename "schinese.lang" { "tchinese", CFG_LANG_T_CHINESE }, { "korean", CFG_LANG_KOREAN }, { NULL, -1 } }; struct TextMap map_alignment[] = { { "left", CFG_ALIGN_LEFT }, { "right", CFG_ALIGN_RIGHT }, { "center", CFG_ALIGN_CENTRE }, { "top", CFG_ALIGN_TOP }, { "bottom", CFG_ALIGN_BOTTOM }, { "middle", CFG_ALIGN_MIDDLE }, { NULL, -1 } }; int map_get_id( struct TextMap *map, char *name ) { int i; for ( i = 0; map[i].name != NULL; i++ ) { if ( strcmp( name, map[i].name ) == 0 ) return map[i].id; } return -1; } char* map_get_name( struct TextMap *map, short id ) { int i; for ( i = 0; map[i].name != NULL; i++ ) { if ( id == map[i].id ) return map[i].name; } return NULL; } bool map_auto( char *name, char *name2, char *val, struct TextMap *map, short *var ) { if ( strcmp( name, name2 ) != 0 ) return false; int id = map_get_id( map, val ); if ( id == -1 ) { //printf("MAP FAIL: %s=%s : %d\n", name, val, id); sleep(1); return false; } *var = id; //printf("MAP AUTO: %s=%s : %d\n", name, val, id); sleep(1); return true; } bool cfg_map_auto( char *name, struct TextMap *map, short *var ) { return map_auto( name, cfg_name, cfg_val, map, var ); } bool cfg_map( char *name, char *val, short *var, short id ) { if ( strcmp( name, cfg_name ) == 0 && strcmpi( val, cfg_val ) == 0 ) { *var = id; return true; } return false; } bool cfg_bool( char *name, short *var ) { return ( cfg_map( name, "0", var, 0 ) || cfg_map( name, "1", var, 1 ) ); } void cfg_int( char *name, short *var, int count ) { char tmp[6]; short i; if ( count > 10 ) //avoid overflow return; for ( i = 0; i < count; i++ ) { sprintf( tmp, "%d", i ); cfg_map( name, tmp, var, i ); } } /* Mapping */ //static char bg_path[100]; void CFG_Default( int widescreen ) // -1 = non forced Mode { if ( widescreen == -1 ) CFG.widescreen = CONF_GetAspectRatio(); else CFG.widescreen = widescreen; if ( CFG.widescreen ) { snprintf( CFG.theme_path, sizeof( CFG.theme_path ), "%s/wtheme/", bootDevice ); } else { snprintf( CFG.theme_path, sizeof( CFG.theme_path ), "%s/theme/", bootDevice ); } if ( widescreen == -1 ) { snprintf( Settings.covers_path, sizeof( Settings.covers_path ), "%s/images/", bootDevice ); //default image path snprintf( Settings.covers2d_path, sizeof( Settings.covers2d_path ), "%s/images/2D/", bootDevice ); //default image path snprintf( Settings.disc_path, sizeof( Settings.disc_path ), "%s/images/disc/", bootDevice ); snprintf( Settings.titlestxt_path, sizeof( Settings.titlestxt_path ), "%s/config/", bootDevice );//default path for disc images char * empty = ""; snprintf( Settings.unlockCode, sizeof( Settings.unlockCode ), empty ); // default password snprintf( Settings.language_path, sizeof( Settings.language_path ), "notset" ); snprintf( Settings.languagefiles_path, sizeof( Settings.languagefiles_path ), "%s/config/language/", bootDevice ); snprintf( Settings.update_path, sizeof( Settings.update_path ), "%s/apps/usbloader_gx/", bootDevice ); snprintf( Settings.theme_downloadpath, sizeof( Settings.theme_downloadpath ), "%s/config/themes/", bootDevice ); snprintf( Settings.homebrewapps_path, sizeof( Settings.homebrewapps_path ), "%s/apps/", bootDevice ); snprintf( Settings.Cheatcodespath, sizeof( Settings.Cheatcodespath ), "%s/codes/", bootDevice ); snprintf( Settings.TxtCheatcodespath, sizeof( Settings.TxtCheatcodespath ), "%s/txtcodes/", bootDevice ); snprintf( Settings.BcaCodepath, sizeof( Settings.BcaCodepath ), "%s/bca/", bootDevice ); snprintf( Settings.WipCodepath, sizeof( Settings.WipCodepath ), "%s/wip/", bootDevice ); snprintf( Settings.dolpath, sizeof( Settings.dolpath ), "%s/", bootDevice ); strcpy( Settings.ogg_path, "" ); } //always set Theme defaults //all alignments are left top here THEME.gamelist_x = 200; THEME.gamelist_y = 49;//40; THEME.gamelist_w = 396; THEME.gamelist_h = 280; THEME.gamegrid_w = 640; THEME.gamegrid_h = 400; THEME.gamegrid_x = 0; THEME.gamegrid_y = 20; THEME.gamecarousel_w = 640; THEME.gamecarousel_h = 400; THEME.gamecarousel_x = 0; THEME.gamecarousel_y = -20; THEME.covers_x = 26; THEME.covers_y = 58; THEME.show_id = 1; THEME.id_x = 68; THEME.id_y = 305; THEME.show_region = 1; THEME.region_x = 68; THEME.region_y = 30; THEME.sdcard_x = 160; THEME.sdcard_y = 395; THEME.homebrew_x = 410; THEME.homebrew_y = 405; THEME.power_x = 576; THEME.power_y = 355; THEME.home_x = 489;//215; THEME.home_y = 371; THEME.setting_x = 64;//-210 THEME.setting_y = 371; THEME.install_x = 16;//-280 THEME.install_y = 355; THEME.clock = ( GXColor ) {138, 138, 138, 240}; THEME.clock_align = CFG_ALIGN_CENTRE; THEME.clock_x = 0; THEME.clock_y = 335;//330; THEME.info = ( GXColor ) {55, 190, 237, 255}; THEME.show_hddinfo = 1; //default THEME.hddinfo_align = CFG_ALIGN_CENTRE; THEME.hddinfo_x = 0; THEME.hddinfo_y = 400; THEME.show_gamecount = 1; //default THEME.gamecount_align = CFG_ALIGN_CENTRE; THEME.gamecount_x = 0; THEME.gamecount_y = 420; THEME.show_tooltip = 1; //1 means use settings, 0 means force turn off THEME.tooltipAlpha = 255; THEME.prompttext = ( GXColor ) {0, 0, 0, 255}; THEME.settingstext = ( GXColor ) {0, 0, 0, 255}; THEME.gametext = ( GXColor ) {0, 0, 0, 255}; THEME.pagesize = 9; THEME.gamelist_favorite_x = CFG.widescreen ? 256 : 220; THEME.gamelist_favorite_y = 13; THEME.gamelist_search_x = CFG.widescreen ? 288 : 260; THEME.gamelist_search_y = 13; THEME.gamelist_abc_x = CFG.widescreen ? 320 : 300; THEME.gamelist_abc_y = 13; THEME.gamelist_count_x = CFG.widescreen ? 352 : 340; THEME.gamelist_count_y = 13; THEME.gamelist_list_x = CFG.widescreen ? 384 : 380; THEME.gamelist_list_y = 13; THEME.gamelist_grid_x = CFG.widescreen ? 416 : 420; THEME.gamelist_grid_y = 13; THEME.gamelist_carousel_x = CFG.widescreen ? 448 : 460; THEME.gamelist_carousel_y = 13; THEME.gamelist_lock_x = CFG.widescreen ? 480 : 500; THEME.gamelist_lock_y = 13; THEME.gamelist_dvd_x = CFG.widescreen ? 512 : 540; THEME.gamelist_dvd_y = 13; THEME.gamegrid_favorite_x = CFG.widescreen ? 192 : 160; THEME.gamegrid_favorite_y = 13; THEME.gamegrid_search_x = CFG.widescreen ? 224 : 200; THEME.gamegrid_search_y = 13; THEME.gamegrid_abc_x = CFG.widescreen ? 256 : 240; THEME.gamegrid_abc_y = 13; THEME.gamegrid_count_x = CFG.widescreen ? 288 : 280; THEME.gamegrid_count_y = 13; THEME.gamegrid_list_x = CFG.widescreen ? 320 : 320; THEME.gamegrid_list_y = 13; THEME.gamegrid_grid_x = CFG.widescreen ? 352 : 360; THEME.gamegrid_grid_y = 13; THEME.gamegrid_carousel_x = CFG.widescreen ? 384 : 400; THEME.gamegrid_carousel_y = 13; THEME.gamegrid_lock_x = CFG.widescreen ? 416 : 440; THEME.gamegrid_lock_y = 13; THEME.gamegrid_dvd_x = CFG.widescreen ? 448 : 480; THEME.gamegrid_dvd_y = 13; THEME.gamecarousel_favorite_x = CFG.widescreen ? 192 : 160; THEME.gamecarousel_favorite_y = 13; THEME.gamecarousel_search_x = CFG.widescreen ? 224 : 200; THEME.gamecarousel_search_y = 13; THEME.gamecarousel_abc_x = CFG.widescreen ? 256 : 240; THEME.gamecarousel_abc_y = 13; THEME.gamecarousel_count_x = CFG.widescreen ? 288 : 280; THEME.gamecarousel_count_y = 13; THEME.gamecarousel_list_x = CFG.widescreen ? 320 : 320; THEME.gamecarousel_list_y = 13; THEME.gamecarousel_grid_x = CFG.widescreen ? 352 : 360; THEME.gamecarousel_grid_y = 13; THEME.gamecarousel_carousel_x = CFG.widescreen ? 384 : 400; THEME.gamecarousel_carousel_y = 13; THEME.gamecarousel_lock_x = CFG.widescreen ? 416 : 440; THEME.gamecarousel_lock_y = 13; THEME.gamecarousel_dvd_x = CFG.widescreen ? 448 : 480; THEME.gamecarousel_dvd_y = 13; } void Global_Default( void ) { Settings.video = discdefault; Settings.vpatch = off; Settings.language = ConsoleLangDefault; Settings.ocarina = off; Settings.hddinfo = hr12; Settings.sinfo = ( ( THEME.show_id ) ? GameID : Neither ); Settings.rumble = RumbleOn; if ( THEME.show_region ) { Settings.sinfo = ( ( Settings.sinfo == GameID ) ? Both : GameRegion ); } Settings.volume = 80; Settings.sfxvolume = 80; Settings.gamesoundvolume = 80; Settings.tooltips = TooltipsOn; char * empty = ""; snprintf( Settings.unlockCode, sizeof( Settings.unlockCode ), empty ); snprintf( Settings.returnTo, sizeof( Settings.returnTo ), empty ); // Settings.godmode = 1; Settings.gamesound = 1; Settings.parentalcontrol = 0; Settings.cios = ios249; Settings.xflip = no; Settings.qboot = no; Settings.wiilight = 1; Settings.autonetwork = 0; Settings.discart = 0; Settings.patchcountrystrings = 0; Settings.gridRows = 3; Settings.error002 = 2; Settings.titlesOverride = 1; snprintf( Settings.db_url, sizeof( Settings.db_url ), empty ); snprintf( Settings.db_language, sizeof( Settings.db_language ), empty ); Settings.db_JPtoEN = 0; Settings.screensaver = 3; Settings.musicloopmode = 1; Settings.partition = -1; Settings.marknewtitles = 1; Settings.FatInstallToDir = 0; Settings.partitions_to_install = install_game_only; Settings.fullcopy = 0; Settings.beta_upgrades = 0; memset( &Settings.parental, 0, sizeof( struct SParental ) ); char buf[0x4a]; CONF_Init(); s32 res = CONF_Get( "IPL.PC", buf, 0x4A ); if ( res > 0 ) { if ( buf[2] != 0x14 ) { Settings.parental.enabled = 1; Settings.parental.rating = buf[2]; } Settings.parental.question = buf[7]; memcpy( Settings.parental.pin, buf + 3, 4 ); memcpy( Settings.parental.answer, buf + 8, 32 ); } Settings.godmode = ( Settings.parental.enabled == 0 ) ? 1 : 0; } char *cfg_get_title( u8 *id ) { if ( !id ) return NULL; int i; for ( i = 0; i < num_title; i++ ) { if ( strncmp( ( char* ) id, cfg_title[i].id, 6 ) == 0 ) { return cfg_title[i].title; } } return NULL; } char *get_title( struct discHdr *header ) { if ( !header ) return NULL; char *title = cfg_get_title( header->id ); if ( title ) return title; return header->title; } void title_set( char *id, char *title ) { if ( !id || !title ) return; if ( !cfg_title ) cfg_title = ( struct ID_Title * ) malloc( sizeof( struct ID_Title ) ); char *idt = cfg_get_title( ( u8* )id ); if ( idt ) { // replace free( idt ); idt = strdup( title ); } else { struct ID_Title * tmpStruct = ( struct ID_Title * ) realloc( cfg_title, ( num_title + 1 ) * sizeof( struct ID_Title ) ); if ( !tmpStruct ) { // error CFG_Cleanup(); num_title = 0; return; } cfg_title = tmpStruct; // add strncpy( cfg_title[num_title].id, id, 6 ); cfg_title[num_title].title = strdup( title ); num_title++; } } void titles_default() { int i; for ( i = 0; i < num_title; i++ ) { memset( cfg_title[i].id, 0, 6 ); free( cfg_title[i].title ); cfg_title[i].title = NULL; } } u8 cfg_get_block( u8 *id ) { int i; for ( i = 0; i < num_control; i++ ) { if ( memcmp( id, cfg_control[i].id, 6 ) == 0 ) { return cfg_control[i].block; } } return 0; } u8 get_block( struct discHdr *header ) { return cfg_get_block( header->id ); } s8 get_pegi_block( struct discHdr *header ) { switch ( get_block( header ) ) { case 1: return 7; case 2: return 12; case 3: return 16; case 4: return 18; default: return -1; } } // trim leading and trailing whitespace // copy at max n or at max size-1 char* trim_n_copy( char *dest, char *src, int n, int size ) { int len; // trim leading white space while ( isspace2( *src ) ) { src++; n--; } len = strlen( src ); if ( len > n ) len = n; // trim trailing white space while ( len > 0 && isspace2( src[len-1] ) ) len--; if ( len >= size ) len = size - 1; strlcpy( dest, src, len + 1 ); //printf("trim_copy: '%s' %d\n", dest, len); //sleep(1); return dest; } char* trimcopy( char *dest, char *src, int size ) { int len; while ( *src == ' ' ) src++; len = strlen( src ); // trim trailing " \r\n" while ( len > 0 && strchr( " \r\n", src[len-1] ) ) len--; if ( len >= size ) len = size - 1; strlcpy( dest, src, len + 1 ); return dest; } void widescreen_set( char *name, char *val ) { cfg_name = name; cfg_val = val; short widescreen; if ( cfg_bool( "widescreen", &widescreen ) && CFG.widescreen != widescreen ) CFG_Default( widescreen ); //reset default when forced an other Screenmode } void path_set( char *name, char *val ) { cfg_name = name; cfg_val = val; // if these are defined in txt file, use them. otherwise use defaults if ( !CFG.widescreen && ( strcmp( name, "theme_path" ) == 0 ) ) // if in 4:3 { strlcpy( CFG.theme_path, val, sizeof( CFG.theme_path ) ); return; } if ( CFG.widescreen && strcmp( name, "wtheme_path" ) == 0 ) // if in 16:9 { strlcpy( CFG.theme_path, val, sizeof( CFG.theme_path ) ); return; } if ( strcmp( name, "cover_path" ) == 0 ) { strlcpy( Settings.covers_path, val, sizeof( Settings.covers_path ) ); return; } if ( strcmp( name, "cover2d_path" ) == 0 ) { strlcpy( Settings.covers2d_path, val, sizeof( Settings.covers2d_path ) ); return; } if ( strcmp( name, "disc_path" ) == 0 ) { strlcpy( Settings.disc_path, val, sizeof( Settings.disc_path ) ); return; } if ( strcmp( name, "titlestxt_path" ) == 0 ) { strlcpy( Settings.titlestxt_path, val, sizeof( Settings.titlestxt_path ) ); return; } if ( strcmp( name, "language_path" ) == 0 ) { strlcpy( Settings.language_path, val, sizeof( Settings.language_path ) ); return; } if ( strcmp( name, "languagefiles_path" ) == 0 ) { strlcpy( Settings.languagefiles_path, val, sizeof( Settings.languagefiles_path ) ); return; } if ( strcmp( name, "update_path" ) == 0 ) { strlcpy( Settings.update_path, val, sizeof( Settings.update_path ) ); return; } if ( strcmp( name, "theme_downloadpath" ) == 0 ) { strlcpy( Settings.theme_downloadpath, val, sizeof( Settings.theme_downloadpath ) ); return; } if ( strcmp( name, "homebrewapps_path" ) == 0 ) { strlcpy( Settings.homebrewapps_path, val, sizeof( Settings.homebrewapps_path ) ); return; } if ( strcmp( name, "Cheatcodespath" ) == 0 ) { strlcpy( Settings.Cheatcodespath, val, sizeof( Settings.Cheatcodespath ) ); return; } if ( strcmp( name, "TxtCheatcodespath" ) == 0 ) { strlcpy( Settings.TxtCheatcodespath, val, sizeof( Settings.TxtCheatcodespath ) ); return; } if ( strcmp( name, "dolpath" ) == 0 ) { strlcpy( Settings.dolpath, val, sizeof( Settings.dolpath ) ); return; } if ( strcmp( name, "ogg_path" ) == 0 ) { strlcpy( Settings.ogg_path, val, sizeof( Settings.ogg_path ) ); return; } if ( strcmp( name, "BcaCodepath" ) == 0 ) { strlcpy( Settings.BcaCodepath, val, sizeof( Settings.BcaCodepath ) ); return; } if ( strcmp( name, "WipCodepath" ) == 0 ) { strlcpy( Settings.WipCodepath, val, sizeof( Settings.WipCodepath ) ); return; } return; } static u32 wCOORDS_FLAGS[2] = {0, 0}; // space for 64 coords - this is enough, also for the future #define GET_wCOORD_FLAG(i) (wCOORDS_FLAGS[i/32] & (1UL << (i%32))) #define SET_wCOORD_FLAG(i) (wCOORDS_FLAGS[i/32] |= (1UL << (i%32))) #define CLEAR_wCOORD_FLAGS (wCOORDS_FLAGS[0] = wCOORDS_FLAGS[1] = 0) #define CFG_COORDS2(name) \ if ((wcoords_idx++, 1) && !GET_wCOORD_FLAG(wcoords_idx) && \ strcmp(cfg_name, #name "_coords") == 0) { \ short x,y; \ if (sscanf(val, "%hd,%hd", &x, &y) == 2) { \ THEME.name##_x = x; \ THEME.name##_y = y; \ } \ } \ else if (CFG.widescreen && \ strcmp(cfg_name, "w" #name "_coords") == 0) { \ short x,y; \ if (sscanf(val, "%hd,%hd", &x, &y) == 2) { \ THEME.name##_x = x; \ THEME.name##_y = y; \ SET_wCOORD_FLAG(wcoords_idx); \ } \ } #define CFG_COORDS4(name) \ if ((wcoords_idx++, 1) && !GET_wCOORD_FLAG(wcoords_idx) && \ strcmp(cfg_name, #name "_coords") == 0) { \ short x,y,w,h; \ if (sscanf(val, "%hd,%hd,%hd,%hd", &x, &y, &w, &h) == 4) { \ THEME.name##_x = x; \ THEME.name##_y = y; \ THEME.name##_w = w; \ THEME.name##_h = h; \ } \ } \ else if (CFG.widescreen && \ strcmp(cfg_name, "w" #name "_coords") == 0) { \ short x,y,w,h; \ if (sscanf(val, "%hd,%hd,%hd,%hd", &x, &y, &w, &h) == 4) { \ THEME.name##_x = x; \ THEME.name##_y = y; \ THEME.name##_w = w; \ THEME.name##_h = h; \ SET_wCOORD_FLAG(wcoords_idx); \ } \ } #define CFG_COLOR(name) \ if (strcmp(cfg_name, #name "_color") == 0) { \ short r,g,b,a; \ int c = sscanf(val, "%hd,%hd,%hd,%hd", &r, &g, &b, &a); \ if(c >= 3) { \ THEME.name.r = r; \ THEME.name.g = g; \ THEME.name.b = b; \ if(c >= 4) \ THEME.name.a = a; \ } \ } #define CFG_VAL(name) \ if (strcmp(cfg_name, #name) == 0) { \ short v; \ if (sscanf(val, "%hd", &v) == 1) { \ THEME.name = v; \ } \ } #define CFG_BOOL(name) if(cfg_bool(#name, &THEME.name)); #define CFG_ALIGN(name) if(cfg_map_auto(#name "_align", map_alignment, &THEME.name##_align)); #define OLD_FAV_ICON 1 #define OLD_ABC_ICON 2 #define OLD_COUNT_ICON 4 #define OLD_LIST_ICON 8 #define OLD_GRID_ICON 16 #define OLD_CAROUSEL_ICON 32 static short WorkAroundIconSet = 0; static short WorkAroundBarOffset = 100; void theme_set( char *name, char *val ) { cfg_name = name; cfg_val = val; int wcoords_idx = -1; CFG_COORDS4( gamelist ) else CFG_COORDS4( gamegrid ) else CFG_COORDS4( gamecarousel ) else CFG_COORDS2( covers ) else CFG_BOOL( show_id ) else CFG_COORDS2( id ) else CFG_BOOL( show_region ) else CFG_COORDS2( region ) else CFG_COORDS2( sdcard ) else CFG_COORDS2( homebrew ) else CFG_COORDS2( power ) else CFG_COORDS2( home ) else CFG_COORDS2( setting ) else CFG_COORDS2( install ) else CFG_COORDS2( clock ) else CFG_ALIGN( clock ) else CFG_COLOR( clock ) else CFG_COLOR( info ) else CFG_BOOL( show_hddinfo ) else CFG_ALIGN( hddinfo ) else CFG_COORDS2( hddinfo ) else CFG_BOOL( show_gamecount ) else CFG_ALIGN( gamecount ) else CFG_COORDS2( gamecount ) else CFG_BOOL( show_tooltip ) else CFG_VAL( tooltipAlpha ) else CFG_COLOR( prompttext ) else CFG_COLOR( settingstext ) else CFG_COLOR( gametext ) else CFG_VAL( pagesize ) else CFG_COORDS2( gamelist_favorite ) else CFG_COORDS2( gamegrid_favorite ) else CFG_COORDS2( gamecarousel_favorite ) else CFG_COORDS2( gamelist_search ) else CFG_COORDS2( gamegrid_search ) else CFG_COORDS2( gamecarousel_search ) else CFG_COORDS2( gamelist_abc ) else CFG_COORDS2( gamegrid_abc ) else CFG_COORDS2( gamecarousel_abc ) else CFG_COORDS2( gamelist_count ) else CFG_COORDS2( gamegrid_count ) else CFG_COORDS2( gamecarousel_count ) else CFG_COORDS2( gamelist_list ) else CFG_COORDS2( gamegrid_list ) else CFG_COORDS2( gamecarousel_list ) else CFG_COORDS2( gamelist_grid ) else CFG_COORDS2( gamegrid_grid ) else CFG_COORDS2( gamecarousel_grid ) else CFG_COORDS2( gamelist_carousel ) else CFG_COORDS2( gamegrid_carousel ) else CFG_COORDS2( gamecarousel_carousel ) else CFG_COORDS2( gamelist_lock ) else CFG_COORDS2( gamegrid_lock ) else CFG_COORDS2( gamecarousel_lock ) else CFG_COORDS2( gamelist_dvd ) else CFG_COORDS2( gamegrid_dvd ) else CFG_COORDS2( gamecarousel_dvd ) //********************************** // Workaround for old Themes //********************************** else if ( strcmp( cfg_name, "favorite_coords" ) == 0 ) { short x, y; if ( sscanf( val, "%hd,%hd", &x, &y ) == 2 ) { // the old Icons are aligned at center and the new at the left top corner. // we must add 320 and sub the half image width to get the correct position. x += 300; // the old stuff is optimized for widescreen. // if no widescreen, we must reposition the pos if ( !CFG.widescreen ) x -= 20; // old themes have no search_coords // set the searchIcon to the Position of the favIcon THEME.gamelist_search_x = x; THEME.gamegrid_search_x = THEME.gamecarousel_search_x = x - WorkAroundBarOffset; THEME.gamelist_search_y = THEME.gamegrid_search_y = THEME.gamecarousel_search_y = y; // place the favIcon to the left side of the searchIcon if ( !CFG.widescreen ) x -= CFG.widescreen ? 32 : 40; THEME.gamelist_favorite_x = x; THEME.gamegrid_favorite_x = THEME.gamecarousel_favorite_x = x - WorkAroundBarOffset; THEME.gamelist_favorite_y = THEME.gamegrid_favorite_y = THEME.gamecarousel_favorite_y = y; WorkAroundIconSet |= OLD_FAV_ICON; } } else if ( strcmp( cfg_name, "abc_coords" ) == 0 ) { short x, y; if ( sscanf( val, "%hd,%hd", &x, &y ) == 2 ) { // the old Icons are aligned at center and the new at the left top corner. // we must add 320 and sub the half image width to get the correct position. x += 300; // the old stuff is optimized for widescreen. // if no widescreen, we must reposition the pos if ( !CFG.widescreen ) x -= 12; THEME.gamelist_abc_x = x; THEME.gamegrid_abc_x = THEME.gamecarousel_abc_x = x - WorkAroundBarOffset; THEME.gamelist_abc_y = THEME.gamegrid_abc_y = THEME.gamecarousel_abc_y = y; WorkAroundIconSet |= OLD_ABC_ICON; } } else if ( strcmp( cfg_name, "count_coords" ) == 0 ) { short x, y; if ( sscanf( val, "%hd,%hd", &x, &y ) == 2 ) { // the old Icons are aligned at center and the new at the left top corner. // we must add 320 and sub the half image width to get the correct position. x += 300; // the old stuff is optimized for widescreen. // if no widescreen, we must reposition the pos if ( !CFG.widescreen ) x -= 4; THEME.gamelist_count_x = x; THEME.gamegrid_count_x = THEME.gamecarousel_count_x = x - WorkAroundBarOffset; THEME.gamelist_count_y = THEME.gamegrid_count_y = THEME.gamecarousel_count_y = y; WorkAroundIconSet |= OLD_COUNT_ICON; } } else if ( strcmp( cfg_name, "list_coords" ) == 0 ) { short x, y; if ( sscanf( val, "%hd,%hd", &x, &y ) == 2 ) { // the old Icons are aligned at center and the new at the left top corner. // we must add 320 and sub the half image width to get the correct position. x += 300; // the old stuff is optimized for widescreen. // if no widescreen, we must reposition the pos if ( !CFG.widescreen ) x += 4; THEME.gamelist_list_x = x; THEME.gamegrid_list_x = THEME.gamecarousel_list_x = x - WorkAroundBarOffset; THEME.gamelist_list_y = THEME.gamegrid_list_y = THEME.gamecarousel_list_y = y; WorkAroundIconSet |= OLD_LIST_ICON; } } else if ( strcmp( cfg_name, "grid_coords" ) == 0 ) { short x, y; if ( sscanf( val, "%hd,%hd", &x, &y ) == 2 ) { // the old Icons are aligned at center and the new at the left top corner. // we must add 320 and sub the half image width to get the correct position. x += 300; // the old stuff is optimized for widescreen. // if no widescreen, we must reposition the pos if ( !CFG.widescreen ) x += 12; THEME.gamelist_grid_x = x; THEME.gamegrid_grid_x = THEME.gamecarousel_grid_x = x - WorkAroundBarOffset; THEME.gamelist_grid_y = THEME.gamegrid_grid_y = THEME.gamecarousel_grid_y = y; WorkAroundIconSet |= OLD_GRID_ICON; } } else if ( strcmp( cfg_name, "carousel_coords" ) == 0 ) { short x, y; if ( sscanf( val, "%hd,%hd", &x, &y ) == 2 ) { // the old Icons are aligned at center and the new at the left top corner. // we must add 320 and sub the half image width to get the correct position. x += 300; // the old stuff is optimized for widescreen. // if no widescreen, we must reposition the pos if ( !CFG.widescreen ) x += 20; THEME.gamelist_carousel_x = x; THEME.gamegrid_carousel_x = THEME.gamecarousel_carousel_x = x - WorkAroundBarOffset; THEME.gamelist_carousel_y = THEME.gamegrid_carousel_y = THEME.gamecarousel_carousel_y = y; WorkAroundIconSet |= OLD_CAROUSEL_ICON; // old themes have no dvd_coords // place the dvdIcon to the right side of the carouselIcon if ( !CFG.widescreen ) x += CFG.widescreen ? 32 : 40; THEME.gamelist_lock_x = x; THEME.gamegrid_lock_x = THEME.gamecarousel_lock_x = x - WorkAroundBarOffset; THEME.gamelist_lock_y = THEME.gamegrid_lock_y = THEME.gamecarousel_lock_y = y; x += CFG.widescreen ? 32 : 40; THEME.gamelist_dvd_x = x; THEME.gamegrid_dvd_x = THEME.gamecarousel_dvd_x = x - WorkAroundBarOffset; THEME.gamelist_dvd_y = THEME.gamegrid_dvd_y = THEME.gamecarousel_dvd_y = y; } } else if ( strcmp( cfg_name, "sortBarOffset" ) == 0 ) { short o; if ( sscanf( val, "%hd", &o ) == 1 ) { if ( WorkAroundIconSet & OLD_FAV_ICON ) { THEME.gamegrid_favorite_x += WorkAroundBarOffset - o; THEME.gamecarousel_favorite_x += WorkAroundBarOffset - o; THEME.gamegrid_search_x += WorkAroundBarOffset - o; THEME.gamecarousel_search_x += WorkAroundBarOffset - o; } if ( WorkAroundIconSet & OLD_ABC_ICON ) { THEME.gamegrid_abc_x += WorkAroundBarOffset - o; THEME.gamecarousel_abc_x += WorkAroundBarOffset - o; } if ( WorkAroundIconSet & OLD_COUNT_ICON ) { THEME.gamegrid_count_x += WorkAroundBarOffset - o; THEME.gamecarousel_count_x += WorkAroundBarOffset - o; } if ( WorkAroundIconSet & OLD_LIST_ICON ) { THEME.gamegrid_list_x += WorkAroundBarOffset - o; THEME.gamecarousel_list_x += WorkAroundBarOffset - o; } if ( WorkAroundIconSet & OLD_GRID_ICON ) { THEME.gamegrid_grid_x += WorkAroundBarOffset - o; THEME.gamecarousel_grid_x += WorkAroundBarOffset - o; } if ( WorkAroundIconSet & OLD_CAROUSEL_ICON ) { THEME.gamegrid_carousel_x += WorkAroundBarOffset - o; THEME.gamecarousel_carousel_x += WorkAroundBarOffset - o; THEME.gamegrid_lock_x += WorkAroundBarOffset - o; THEME.gamecarousel_lock_x += WorkAroundBarOffset - o; THEME.gamegrid_dvd_x += WorkAroundBarOffset - o; THEME.gamecarousel_dvd_x += WorkAroundBarOffset - o; } WorkAroundBarOffset = o; } } } void global_cfg_set( char *name, char *val ) { cfg_name = name; cfg_val = val; if ( strcmp( name, "video" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.video = i; } return; } else if ( strcmp( name, "vpatch" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.vpatch = i; } return; } else if ( strcmp( name, "language" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.language = i; } return; } else if ( strcmp( name, "ocarina" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.ocarina = i; } return; } else if ( strcmp( name, "sort" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.sort = i; } return; } else if ( strcmp( name, "fave" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.fave = i; } return; } else if ( strcmp( name, "keyset" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.keyset = i; } return; } else if ( strcmp( name, "hddinfo" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.hddinfo = i; } return; } else if ( strcmp( name, "sinfo" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.sinfo = i; } return; } else if ( strcmp( name, "rumble" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.rumble = i; } return; } else if ( strcmp( name, "volume" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.volume = i; } return; } else if ( strcmp( name, "sfxvolume" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.sfxvolume = i; } return; } else if ( strcmp( name, "gamesoundvolume" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.gamesoundvolume = i; } return; } else if ( strcmp( name, "tooltips" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.tooltips = i; } return; } else if ( strcmp( name, "password" ) == 0 ) { strlcpy( Settings.unlockCode, val, sizeof( Settings.unlockCode ) ); return; } else if ( strcmp( name, "returnTo" ) == 0 ) { strlcpy( Settings.returnTo, val, sizeof( Settings.returnTo ) ); return; } else if ( strcmp( name, "parentalcontrol" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.parentalcontrol = i; } return; } else if ( strcmp( name, "cios" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.cios = i; } return; } else if ( strcmp( name, "gridRows" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.gridRows = i; } return; } else if ( strcmp( name, "xflip" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.xflip = i; } return; } else if ( strcmp( name, "qboot" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.qboot = i; } return; } else if ( strcmp( name, "wsprompt" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.wsprompt = i; } return; } else if ( strcmp( name, "wiilight" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.wiilight = i; } return; } else if ( strcmp( name, "autonetwork" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.autonetwork = i; } return; } else if ( strcmp( name, "discart" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.discart = i; } return; } else if ( strcmp( name, "patchcountrystrings" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.patchcountrystrings = i; } return; } else if ( strcmp( name, "error002" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.error002 = i; } return; } else if ( strcmp( name, "gamesound" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.gamesound = i; } return; } else if ( strcmp( name, "titlesOverride" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.titlesOverride = i; } return; } else if ( strcmp( name, "db_JPtoEN" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.db_JPtoEN = i; } return; } else if ( strcmp( name, "gameDisplay" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.gameDisplay = i; } return; } else if ( strcmp( name, "screensaver" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.screensaver = i; } return; } else if ( strcmp( name, "musicloopmode" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.musicloopmode = i; } return; } else if ( strcmp( name, "partition" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.partition = i; } return; } else if ( strcmp( name, "marknewtitles" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.marknewtitles = i; } return; } else if ( strcmp( name, "fatInstallToDir" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.FatInstallToDir = i; } } else if ( strcmp( name, "partitions" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.partitions_to_install = i; } } else if ( strcmp( name, "fullcopy" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.fullcopy = i; } } else if ( strcmp( name, "beta_upgrades" ) == 0 ) { int i; if ( sscanf( val, "%d", &i ) == 1 ) { Settings.beta_upgrades = i; } } cfg_bool( "godmode", &Settings.godmode ); return; } // split line to part1 delimiter part2 bool trimsplit( char *line, char *part1, char *part2, char delim, int size ) { char *eq = strchr( line, delim ); if ( !eq ) return false; trim_n_copy( part1, line, eq - line, size ); trimcopy( part2, eq + 1, size ); return true; } void cfg_parseline( char *line, void ( *set_func )( char*, char* ) ) { // split name = value char tmp[300], name[200], val[200]; strlcpy( tmp, line, sizeof( tmp ) ); char *eq = strchr( tmp, '=' ); if ( !eq ) return; *eq = 0; trimcopy( name, tmp, sizeof( name ) ); trimcopy( val, eq + 1, sizeof( val ) ); //printf("CFG: %s = %s\n", name, val); set_func( name, val ); } void cfg_parsetitleline( char *line, void ( *set_func )( char*, char*, u8 ) ) { // split name = value char tmp[200], name[200], val[200]; int block = 0; strlcpy( tmp, line, sizeof( tmp ) ); char *eq = strchr( tmp, '=' ); if ( !eq ) return; *eq = 0; trimcopy( name, tmp, sizeof( name ) ); char *blockpos = strrchr( eq + 1, '=' ); if ( !blockpos ) trimcopy( val, eq + 1, sizeof( val ) ); else { *blockpos = 0; trimcopy( val, eq + 1, sizeof( val ) ); if ( sscanf( blockpos + 1, "%d", &block ) != 1 ) { block = 0; } } set_func( name, val, block ); } bool cfg_parsefile( char *fname, void ( *set_func )( char*, char* ) ) { FILE *f; char line[300]; //printf("opening(%s)\n", fname); f = fopen( fname, "r" ); if ( !f ) { //printf("error opening(%s)\n", fname); return false; } while ( fgets( line, sizeof( line ), f ) ) { // lines starting with # are comments if ( line[0] == '#' ) continue; cfg_parseline( line, set_func ); } fclose( f ); return true; } bool cfg_parsetitlefile( char *fname, void ( *set_func )( char*, char*, u8 ) ) { FILE *f; char line[200]; //printf("opening(%s)\n", fname); f = fopen( fname, "r" ); if ( !f ) { //printf("error opening(%s)\n", fname); return false; } while ( fgets( line, sizeof( line ), f ) ) { // lines starting with # are comments if ( line[0] == '#' ) continue; cfg_parsetitleline( line, set_func ); } fclose( f ); return true; } /* void cfg_parsearg(int argc, char **argv) { int i; char *eq; char pathname[200]; for (i=1; ivideo = opt_v; } if ( map_auto( "language", opt_name, opt_val, map_language, &opt_l ) ) { // valid option, assign game->language = opt_l; } if ( strcmp( "ocarina", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->ocarina = opt_c; } } if ( strcmp( "vipatch", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->vipatch = opt_c; } } if ( strcmp( "ios", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->ios = opt_c; } } if ( strcmp( "pctrl", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->parentalcontrol = opt_c; } } if ( strcmp( "errorfix002", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->errorfix002 = opt_c; } } if ( strcmp( "iosreloadblock", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->iosreloadblock = opt_c; } } if ( strcmp( "patchcountrystrings", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->patchcountrystrings = opt_c; } } if ( strcmp( "loadalternatedol", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->loadalternatedol = opt_c; } } if ( strcmp( "alternatedolstart", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->alternatedolstart = opt_c; } } if ( strcmp( "alternatedolname", opt_name ) == 0 ) { strlcpy( game->alternatedolname, opt_val, sizeof( game->alternatedolname ) ); } if ( strcmp( "returnTo", opt_name ) == 0 ) { strlcpy( game->returnTo, opt_val, sizeof( game->returnTo ) ); } } // next opt if ( np ) p = np + 1; else p = NULL; } } void parental_set( char *name, char *val ) { // sample line: // game:RTNP41 = video:game; language:english; ocarina:0; // game:RYWP01 = video:patch; language:console; ocarina:1; //printf("GAME: '%s=%s'\n", name, val); u8 id[8]; if ( strncmp( name, "game:", 5 ) != 0 ) return; trimcopy( ( char* )id, name + 5, sizeof( id ) ); // parse val // first split options by ; char opt[200], *p, *np; p = val; while ( p ) { np = strchr( p, ';' ); if ( np ) trim_n_copy( opt, p, np - p, sizeof( opt ) ); else trimcopy( opt, p, sizeof( opt ) ); //printf("GAME(%s) (%s)\n", id, opt); sleep(1); // parse opt 'language:english' char opt_name[200], opt_val[200]; if ( trimsplit( opt, opt_name, opt_val, ':', sizeof( opt_name ) ) ) { //printf("GAME(%s) (%s=%s)\n", id, opt_name, opt_val); sleep(1); short opt_c; if ( strcmp( "pctrl", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { cfg_control = realloc( cfg_control, ( num_control + 1 ) * sizeof( struct ID_Control ) ); if ( !cfg_control ) { // error num_control = 0; return; } // add strcpy( cfg_control[num_control].id, ( char* ) id ); cfg_control[num_control].block = opt_c; num_control++; } } } // next opt if ( np ) p = np + 1; else p = NULL; } } void game_set_num( char *name, char *val ) { u8 id[8]; struct Game_NUM *game; if ( strncmp( name, "game:", 5 ) != 0 ) return; trimcopy( ( char* )id, name + 5, sizeof( id ) ); game = cfg_get_game_num( id ); cfg_set_game_num( game, id ); // parse val // first split options by ; char opt[200], *p, *np; p = val; while ( p ) { np = strchr( p, ';' ); if ( np ) trim_n_copy( opt, p, np - p, sizeof( opt ) ); else trimcopy( opt, p, sizeof( opt ) ); char opt_name[200], opt_val[200]; if ( trimsplit( opt, opt_name, opt_val, ':', sizeof( opt_name ) ) ) { short opt_c; if ( strcmp( "favorite", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->favorite = opt_c; } } if ( strcmp( "count", opt_name ) == 0 ) { if ( sscanf( opt_val, "%hd", &opt_c ) == 1 ) { game->count = opt_c; } } } if ( np ) p = np + 1; else p = NULL; } } bool cfg_load_games() { char GXGameSettings_cfg[32]; sprintf( GXGameSettings_cfg, "%s/config/GXGameSettings.cfg", bootDevice ); return cfg_parsefile( GXGameSettings_cfg, &game_set ); } bool cfg_load_game_num() { char GXGameFavorites_cfg[32]; sprintf( GXGameFavorites_cfg, "%s/config/GXGameFavorites.cfg", bootDevice ); return cfg_parsefile( GXGameFavorites_cfg, &game_set_num ); } bool cfg_save_games() { FILE *f; int i; char GXGameSettings_cfg[50]; sprintf( GXGameSettings_cfg, "%s/config", bootDevice ); mkdir( GXGameSettings_cfg, 0777 ); sprintf( GXGameSettings_cfg, "%s/config/GXGameSettings.cfg", bootDevice ); f = fopen( GXGameSettings_cfg, "w" ); if ( !f ) { printf( "Error saving %s\n", "GXGameSettings.cfg" ); sleep( 1 ); return false; } fprintf( f, "# USB Loader settings file\n" ); fprintf( f, "# note: this file is automatically generated\n" ); fclose( f ); /* Closing and reopening because of a write issue we are having right now */ f = fopen( GXGameSettings_cfg, "w" ); fprintf( f, "# USB Loader settings file\n" ); fprintf( f, "# note: this file is automatically generated\n" ); fprintf( f, "# Num Games: %d\n", num_saved_games ); for ( i = 0; i < num_saved_games; i++ ) { char *s; fprintf( f, "game:%s = ", cfg_game[i].id ); s = map_get_name( map_video, cfg_game[i].video ); if ( s ) fprintf( f, "video:%s; ", s ); s = map_get_name( map_language, cfg_game[i].language ); if ( s ) fprintf( f, "language:%s; ", s ); fprintf( f, "ocarina:%d; ", cfg_game[i].ocarina ); fprintf( f, "vipatch:%d; ", cfg_game[i].vipatch ); fprintf( f, "ios:%d; ", cfg_game[i].ios ); fprintf( f, "pctrl:%d; ", cfg_game[i].parentalcontrol ); fprintf( f, "errorfix002:%d; ", cfg_game[i].errorfix002 ); fprintf( f, "iosreloadblock:%d; ", cfg_game[i].iosreloadblock ); fprintf( f, "patchcountrystrings:%d; ", cfg_game[i].patchcountrystrings ); fprintf( f, "loadalternatedol:%d;", cfg_game[i].loadalternatedol ); fprintf( f, "alternatedolstart:%d;", cfg_game[i].alternatedolstart ); fprintf( f, "alternatedolname:%s;\n", cfg_game[i].alternatedolname ); fprintf( f, "returnTo:%s;\n", cfg_game[i].returnTo ); } fprintf( f, "# END\n" ); fclose( f ); return true; } bool cfg_save_game_num() { FILE *f; int i; char GXGameFavorites_cfg[32]; sprintf( GXGameFavorites_cfg, "%s/config", bootDevice ); mkdir( GXGameFavorites_cfg, 0777 ); sprintf( GXGameFavorites_cfg, "%s/config/GXGameFavorites.cfg", bootDevice ); f = fopen( GXGameFavorites_cfg, "w" ); if ( !f ) { printf( "Error saving %s\n", "GXGameFavorites.cfg" ); sleep( 1 ); return false; } fprintf( f, "# USB Loader settings file\n" ); fprintf( f, "# note: this file is automatically generated\n" ); fclose( f ); /* Closing and reopening because of a write issue we are having right now */ f = fopen( GXGameFavorites_cfg, "w" ); fprintf( f, "# USB Loader settings file\n" ); fprintf( f, "# note: this file is automatically generated\n" ); fprintf( f, "# Num Games: %d\n", num_saved_game_num ); for ( i = 0; i < num_saved_game_num; i++ ) { fprintf( f, "game:%s = ", cfg_game_num[i].id ); fprintf( f, "favorite:%d; ", cfg_game_num[i].favorite ); fprintf( f, "count:%d;\n", cfg_game_num[i].count ); } fprintf( f, "# END\n" ); fclose( f ); return true; } bool CFG_reset_all_playcounters() { FILE *f; int i; char GXGameFavorites_cfg[32]; sprintf( GXGameFavorites_cfg, "%s/config", bootDevice ); mkdir( GXGameFavorites_cfg, 0777 ); sprintf( GXGameFavorites_cfg, "%s/config/GXGameFavorites.cfg", bootDevice ); f = fopen( GXGameFavorites_cfg, "w" ); if ( !f ) { printf( "Error saving %s\n", "GXGameFavorites.cfg" ); sleep( 1 ); return false; } fprintf( f, "# USB Loader settings file\n" ); fprintf( f, "# note: this file is automatically generated\n" ); fclose( f ); /* Closing and reopening because of a write issue we are having right now */ f = fopen( GXGameFavorites_cfg, "w" ); fprintf( f, "# USB Loader settings file\n" ); fprintf( f, "# note: this file is automatically generated\n" ); fprintf( f, "# Num Games: %d\n", num_saved_game_num ); for ( i = 0; i < num_saved_game_num; i++ ) { fprintf( f, "game:%s = ", cfg_game_num[i].id ); fprintf( f, "favorite:%d; ", cfg_game_num[i].favorite ); fprintf( f, "count:0;\n" ); } fprintf( f, "# END\n" ); fclose( f ); return true; } #if 0 bool cfg_load_global() { char GXGlobal_cfg[26]; sprintf( GXGlobal_cfg, "%s/config/GXGlobal.cfg", bootDevice ); //Default values defined by dev team Settings.video = discdefault; Settings.vpatch = off; Settings.language = ConsoleLangDefault; Settings.ocarina = off; Settings.xflip = off; Settings.qboot = off; Settings.wsprompt = off; Settings.keyset = us; Settings.hddinfo = hr12; Settings.gameDisplay = list; Settings.sinfo = ( ( THEME.show_id ) ? GameID : Neither ); Settings.rumble = RumbleOn; if ( THEME.show_region ) { Settings.sinfo = ( ( Settings.sinfo == GameID ) ? Both : GameRegion ); } Settings.volume = 80; Settings.sfxvolume = 80; Settings.gamesoundvolume = 80; Settings.titlesOverride = 1; Settings.partition = -1; char * empty = ""; snprintf( Settings.db_url, sizeof( Settings.db_url ), empty ); snprintf( Settings.db_language, sizeof( Settings.db_language ), empty ); Settings.db_JPtoEN = 0; return cfg_parsefile( GXGlobal_cfg, &global_cfg_set ); } #endif struct Game_CFG* CFG_get_game_opt( const u8 *id ) { int i; for ( i = 0; i < num_saved_games; i++ ) { if ( memcmp( id, cfg_game[i].id, 6 ) == 0 ) { return &cfg_game[i]; } } return NULL; } struct Game_NUM* CFG_get_game_num( const u8 *id ) { int i; for ( i = 0; i < num_saved_game_num; i++ ) { if ( memcmp( id, cfg_game_num[i].id, 6 ) == 0 ) { return &cfg_game_num[i]; } } return NULL; } bool CFG_save_game_opt( u8 *id ) { struct Game_CFG *game = cfg_get_game( id ); if ( !game ) return false; cfg_set_game_opt( game, id ); return cfg_save_games(); } bool CFG_save_game_num( u8 *id ) { struct Game_NUM *game = cfg_get_game_num( id ); if ( !game ) return false; cfg_set_game_num( game, id ); return cfg_save_game_num(); } bool CFG_forget_game_opt( u8 *id ) { struct Game_CFG *game = CFG_get_game_opt( id ); int i; if ( !game ) return true; // move entries down num_saved_games--; for ( i = game - cfg_game; i < num_saved_games; i++ ) { cfg_game[i] = cfg_game[i+1]; } memset( &cfg_game[num_saved_games], 0, sizeof( struct Game_CFG ) ); return cfg_save_games(); } bool CFG_forget_game_num( u8 *id ) { struct Game_NUM *game = CFG_get_game_num( id ); int i; if ( !game ) return true; // move entries down num_saved_game_num--; for ( i = game - cfg_game_num; i < num_saved_game_num; i++ ) { cfg_game[i] = cfg_game[i+1]; } memset( &cfg_game[num_saved_game_num], 0, sizeof( struct Game_NUM ) ); return cfg_save_game_num(); } void CFG_Load( void ) { // GUI should be stopped at the time of calling CFG_Load() to prevent default settings from having any effect char pathname[200]; // bool ret = false; //set app path // chdir_app(argv[0]); CFG_Default( -1 ); // set defaults non forced snprintf( pathname, sizeof( pathname ), "%s/config/GXGlobal.cfg", bootDevice ); cfg_parsefile( pathname, &widescreen_set ); //first set widescreen cfg_parsefile( pathname, &path_set ); //then set config and layout options WorkAroundIconSet = 0; WorkAroundBarOffset = 100; // set Workaroundstuff to defaults CLEAR_wCOORD_FLAGS; snprintf( pathname, sizeof( pathname ), "%sGXtheme.cfg", CFG.theme_path ); cfg_parsefile( pathname, &theme_set ); //finally set theme information // set GUI language, use Wii's language setting if language is set to default int wiilang; bool langisdefault = false; wiilang = CONF_GetLanguage(); if ( !strcmp( "notset", Settings.language_path ) ) { snprintf( Settings.language_path, sizeof( Settings.language_path ), "%s%s.lang", Settings.languagefiles_path, map_get_name( map_language, wiilang + 1 ) ); // + 1 because because CONF_LANG starts at 0 if ( !checkfile( Settings.language_path ) ) { sprintf( Settings.language_path, "notset" ); } gettextLoadLanguage( Settings.language_path ); langisdefault = true; } snprintf( pathname, sizeof( pathname ), Settings.language_path ); gettextLoadLanguage( pathname ); // cfg_parsefile(pathname, &language_set); snprintf( pathname, sizeof( pathname ), "%s/config/GXGameSettings.cfg", bootDevice ); cfg_parsefile( pathname, &parental_set ); // load per-game settings cfg_load_games(); cfg_load_game_num(); Global_Default(); //global default depends on theme information CFG_LoadGlobal(); // use GUI language for the database (Settings.db_language is used for game info/titles and covers) char * languagefile; languagefile = strrchr( Settings.language_path, '/' ) + 1; int mainlangid = -1; int i; if ( strcmp( "notset", Settings.language_path ) ) { for ( i = 0; map_language[i].name != NULL; i++ ) { if ( strstr( languagefile, map_language[i].name ) != NULL ) { mainlangid = i - 1; // - 1 because CONF_LANG starts at 0 break; } } } else { mainlangid = wiilang; } GetLanguageToLangCode( &mainlangid, Settings.db_language ); // set language code for countries that don't have a language setting on the Wii if ( !strcmp( Settings.db_language, "" ) ) { if ( strstr( languagefile, "portuguese" ) != NULL ) strcpy( Settings.db_language, "PT" ); } if ( CONF_GetArea() == CONF_AREA_AUS ) strcpy( Settings.db_language, "AU" ); // if GUI language is set to default Settings.language_path needs to remain "notset" (if the detected setting was kept detection wouldn't work next time) if ( langisdefault ) sprintf( Settings.language_path, "notset" ); Settings.godmode = ( Settings.parental.enabled == 0 && ( Settings.parentalcontrol == 0 || strlen( Settings.unlockCode ) == 0 ) ) ? 1 : 0; } void CFG_LoadGlobal( void ) { char GXGlobal_cfg[26]; sprintf( GXGlobal_cfg, "%s/config/GXGlobal.cfg", bootDevice ); cfg_parsefile( GXGlobal_cfg, &global_cfg_set ); } void CFG_Cleanup( void ) { int i = 0; for ( i = 0; i < num_title; i++ ) { if ( cfg_title[i].title ) free( cfg_title[i].title ); cfg_title[i].title = NULL; } if ( cfg_title ) { free( cfg_title ); cfg_title = NULL; } num_title = 0; } /* map language id (or Wii language settting if langid is set to -1) to language code. CONF_LANG_JAPANESE = 0, not 1 */ void GetLanguageToLangCode( int *langid, char *langcode ) { if ( langid < 0 ) *langid = CONF_GetLanguage(); switch ( *langid ) { case CONF_LANG_JAPANESE: sprintf( langcode, "JA" ); break; case CONF_LANG_ENGLISH: sprintf( langcode, "EN" ); break; case CONF_LANG_GERMAN: sprintf( langcode, "DE" ); break; case CONF_LANG_FRENCH: sprintf( langcode, "FR" ); break; case CONF_LANG_SPANISH: sprintf( langcode, "ES" ); break; case CONF_LANG_ITALIAN: sprintf( langcode, "IT" ); break; case CONF_LANG_DUTCH: sprintf( langcode, "NL" ); break; case CONF_LANG_SIMP_CHINESE: sprintf( langcode, "ZHCN" ); // People's Republic of China break; case CONF_LANG_TRAD_CHINESE: sprintf( langcode, "ZHTW" ); // Taiwan break; case CONF_LANG_KOREAN: sprintf( langcode, "KO" ); break; } }