#include #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; char alternatedname[40]; #define TITLE_MAX 200 struct ID_Title { u8 id[5]; char title[TITLE_MAX]; }; struct ID_Control { u8 id[5]; 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[5]; 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.oggload_path, sizeof(Settings.oggload_path), "%s/config/backgroundmusic/", bootDevice); snprintf(Settings.update_path, sizeof(Settings.update_path), "%s/apps/usbloader_gx/", 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.dolpath, sizeof(Settings.dolpath), "%s/", bootDevice); sprintf(Settings.ogg_path, "notset"); } //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 ? 288 : 260; THEME.gamelist_favorite_y = 13; THEME.gamelist_search_x = CFG.widescreen ? 320 : 300; THEME.gamelist_search_y = 13; THEME.gamelist_abc_x = CFG.widescreen ? 352 : 340; THEME.gamelist_abc_y = 13; THEME.gamelist_count_x = CFG.widescreen ? 384 : 380; THEME.gamelist_count_y = 13; THEME.gamelist_list_x = CFG.widescreen ? 416 : 420; THEME.gamelist_list_y = 13; THEME.gamelist_grid_x = CFG.widescreen ? 448 : 460; THEME.gamelist_grid_y = 13; THEME.gamelist_carousel_x = CFG.widescreen ? 480 : 500; THEME.gamelist_carousel_y = 13; THEME.gamelist_dvd_x = CFG.widescreen ? 512 : 540; THEME.gamelist_dvd_y = 13; THEME.gamegrid_favorite_x = CFG.widescreen ? 208 : 180; THEME.gamegrid_favorite_y = 13; THEME.gamegrid_search_x = CFG.widescreen ? 240 : 220; THEME.gamegrid_search_y = 13; THEME.gamegrid_abc_x = CFG.widescreen ? 272 : 260; THEME.gamegrid_abc_y = 13; THEME.gamegrid_count_x = CFG.widescreen ? 304 : 300; THEME.gamegrid_count_y = 13; THEME.gamegrid_list_x = CFG.widescreen ? 336 : 340; THEME.gamegrid_list_y = 13; THEME.gamegrid_grid_x = CFG.widescreen ? 368 : 380; THEME.gamegrid_grid_y = 13; THEME.gamegrid_carousel_x = CFG.widescreen ? 400 : 420; THEME.gamegrid_carousel_y = 13; THEME.gamegrid_dvd_x = CFG.widescreen ? 432 : 460; THEME.gamegrid_dvd_y = 13; THEME.gamecarousel_favorite_x = CFG.widescreen ? 208 : 180; THEME.gamecarousel_favorite_y = 13; THEME.gamecarousel_search_x = CFG.widescreen ? 240 : 220; THEME.gamecarousel_search_y = 13; THEME.gamecarousel_abc_x = CFG.widescreen ? 272 : 260; THEME.gamecarousel_abc_y = 13; THEME.gamecarousel_count_x = CFG.widescreen ? 304 : 300; THEME.gamecarousel_count_y = 13; THEME.gamecarousel_list_x = CFG.widescreen ? 336 : 340; THEME.gamecarousel_list_y = 13; THEME.gamecarousel_grid_x = CFG.widescreen ? 368 : 380; THEME.gamecarousel_grid_y = 13; THEME.gamecarousel_carousel_x = CFG.widescreen ? 400 : 420; THEME.gamecarousel_carousel_y = 13; THEME.gamecarousel_dvd_x = CFG.widescreen ? 432 : 460; 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.tooltips = TooltipsOn; char * empty = ""; snprintf(Settings.unlockCode, sizeof(Settings.unlockCode), empty); Settings.godmode = 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 = 0; 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; } char *cfg_get_title(u8 *id) { int i; for (i=0; iid); if (title) return title; return header->title; } void title_set(char *id, char *title) { char *idt = cfg_get_title((u8*)id); if (idt) { // replace strlcpy(idt, title, TITLE_MAX); } else { cfg_title = realloc(cfg_title, (num_title+1) * sizeof(struct ID_Title)); if (!cfg_title) { // error num_title = 0; return; } // add memcpy(cfg_title[num_title].id, id, 4); cfg_title[num_title].id[4] = 0; strlcpy(cfg_title[num_title].title, title, TITLE_MAX); num_title++; } } void titles_default() { int i; for (i=0; iid); } // 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, "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, "oggload_path") == 0) { strlcpy(Settings.oggload_path, val, sizeof(Settings.oggload_path)); 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; } 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_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_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_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, "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, "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, "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; } 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)); } } // 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 memcpy(cfg_control[num_control].id, id, 4); cfg_control[num_control].id[4] = 0; 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