/* Return equals 0 to continue, -1 to stop, otherwise a number. */ int ListChoice(int hmm) { char buf[32]; if(!hmm) { int num=0; tryagain: CHEAT_printf(" <'Enter' to continue, (S)top, or #> "); CHEAT_gets(buf,32); if(buf[0]=='s' || buf[0]=='S') return(-1); if(!buf[0]) return(0); if(!trio_sscanf(buf,"%d",&num)) return(0); if(num<1) goto tryagain; return(num); } else { int num=0; tryagain2: CHEAT_printf(" <'Enter' to make no selection, or #> "); CHEAT_gets(buf,32); if(!buf[0]) return(0); if(!trio_sscanf(buf,"%d",&num)) return(0); if(num<1) goto tryagain2; return(num); } }
static int ShowShortList(const char *moe[], unsigned int n, int def) { unsigned int x; int c; unsigned int baa; char tmp[256]; red: for(x=0;x<n;x++) CHEAT_printf("%d) %s",x+1,moe[x]); CHEAT_puts("D) Display List"); clo: CHEAT_puts(""); CHEAT_printf("Selection [%d]> ",def+1); CHEAT_gets(tmp,256); if(!tmp[0]) return def; c=tolower(tmp[0]); baa=c-'1'; if(baa<n) return baa; else if(c=='d') goto red; else { CHEAT_puts("Invalid selection."); goto clo; } }
static void ListCheats(void) { int which; lid=0; BeginListShow(); MDFNI_ListCheats(clistcallb,0); which=EndListShow(); if(which>=0) { char tmp[32]; CHEAT_printf(" <(T)oggle status, (M)odify, or (D)elete this cheat.> "); CHEAT_gets(tmp,32); switch(tolower(tmp[0])) { case 't':ToggleCheat(which); break; case 'd':if(!MDFNI_DelCheat(which)) CHEAT_puts("Error deleting cheat!"); else CHEAT_puts("Cheat has been deleted."); break; case 'm':ModifyCheat(which); break; } } }
static void DoMenu(const std::vector<MENU>& men, bool topmost = 0) { bool MenuLoop = TRUE; while(MenuLoop) { int x; CHEAT_puts(""); for(x = 0; x < (int)men.size(); x++) CHEAT_printf("%d) %s", x + 1, men[x].text.c_str()); CHEAT_puts("D) Display Menu"); if(!topmost) CHEAT_puts("X) Return to Previous"); bool CommandLoop = TRUE; while(CommandLoop) { char buf[32]; int c, c_numeral; CHEAT_printf("Command> "); CHEAT_gets(buf,32); c = tolower(buf[0]); if(c == 0) continue; else if(c == 'd') { CommandLoop = FALSE; } else if(c == 'x' && !topmost) { CommandLoop = FALSE; MenuLoop = FALSE; } else if(trio_sscanf(buf, "%d", &c_numeral) == 1 && c_numeral <= x && c_numeral >= 1) { assert(!(men[c_numeral - 1].func_action && men[c_numeral - 1].menu_action)); if(men[c_numeral - 1].func_action) men[c_numeral - 1].func_action(men[c_numeral - 1].data); else if(men[c_numeral - 1].menu_action) DoMenu(*men[c_numeral - 1].menu_action); /* Mmm...recursivey goodness. */ CommandLoop = FALSE; } else { CHEAT_puts("Invalid command."); } } // while(CommandLoop) } // while(MenuLoop) }
static char CHEAT_getchar(char def) { uint8 buf[2]; CHEAT_gets((char *)buf, 2); if(buf[0] == 0) return(def); return(buf[0]); }
static int GetYN(int def) { char buf[32]; CHEAT_printf("(Y/N)[%s]: ",def?"Y":"N"); CHEAT_gets(buf,32); if(buf[0]=='y' || buf[0]=='Y') return(1); if(buf[0]=='n' || buf[0]=='N') return(0); return(def); }
static void DoMenu(MENU *men, bool topmost = 0) { int x=0; redisplay: x=0; CHEAT_puts(""); while(men[x].text) { CHEAT_printf("%d) %s",x+1,men[x].text); x++; } CHEAT_puts("D) Display Menu"); if(!topmost) CHEAT_puts("X) Return to Previous"); { char buf[32]; int c; recommand: CHEAT_printf("Command> "); CHEAT_gets(buf,32); c=tolower(buf[0]); if(c == 0) goto recommand; else if(c=='d') goto redisplay; else if(c=='x' && !topmost) { return; } else if(trio_sscanf(buf,"%d",&c)) { if(c>x) goto invalid; if(men[c-1].type) { void (*func)(void)=(void(*)())men[c-1].action; func(); } else DoMenu((MENU*)men[c-1].action); /* Mmm...recursivey goodness. */ goto redisplay; } else { invalid: CHEAT_puts("Invalid command."); goto recommand; } } }
static uint64 GetUI(uint64 def) { char buf[64]; memset(buf, 0, sizeof(buf)); CHEAT_gets(buf,64); if(!buf[0]) return(def); if(buf[0] == '$') trio_sscanf(buf + 1, "%llx", &def); // $0FCE else if(buf[0] == '0' && tolower(buf[1]) == 'x') trio_sscanf(buf + 2, "%llx", &def); // 0x0FCE else if(tolower(buf[strlen(buf) - 1]) == 'h') // 0FCEh trio_sscanf(buf, "%llx", &def); else trio_sscanf(buf,"%lld", &def); return def; }
static void ListCheats(void* data) { int which; lid=0; BeginListShow(); MDFNI_ListCheats(clistcallb,0); which=EndListShow(); if(which>=0) { char tmp[32]; CHEAT_printf(" <(T)oggle status, (M)odify, or (D)elete this cheat.> "); CHEAT_gets(tmp,32); switch(tolower(tmp[0])) { case 't':ToggleCheat(which); break; case 'd': try { MDFNI_DelCheat(which); } catch(std::exception &e) { CHEAT_printf("Error deleting cheat: %s", e.what()); break; } CHEAT_puts("Cheat has been deleted."); break; case 'm':ModifyCheat(which); break; } } }
static void GetString(char *s, int max) { CHEAT_gets(s, max); MDFN_trim(s); }