int main_menu(SDL_Renderer *renderer) { int should_quit = 0; Code code = CODE_OK; Menu menu; CommandTable command_table; char title[MAXIMUM_STRING_SIZE]; char *options[] = {"Play", "Top Scores", "Info", "Quit"}; sprintf(title, "%s %s", "Walls of Doom", WALLS_OF_DOOM_VERSION); menu.title = title; menu.options = options; menu.option_count = 4; menu.selected_option = 0; initialize_command_table(&command_table); while (!should_quit) { write_menu(&menu, renderer); read_commands(&command_table); if (test_command_table(&command_table, COMMAND_UP, REPETITION_DELAY)) { if (menu.selected_option > 0) { menu.selected_option--; } else { menu.selected_option = menu.option_count - 1; } } else if (test_command_table(&command_table, COMMAND_DOWN, REPETITION_DELAY)) { if (menu.selected_option + 1 < menu.option_count) { menu.selected_option++; } else { menu.selected_option = 0; } } else if (test_command_table(&command_table, COMMAND_ENTER, REPETITION_DELAY) || test_command_table(&command_table, COMMAND_CENTER, REPETITION_DELAY)) { if (menu.selected_option == 0) { code = game(renderer, &command_table); } else if (menu.selected_option == 1) { code = top_scores(renderer, &command_table); } else if (menu.selected_option == 2) { code = info(renderer, &command_table); } else if (menu.selected_option == 3) { should_quit = 1; } /* If it is not defined whether or not we should quit, check the code. */ if (should_quit == 0) { should_quit = is_termination_code(code); } } /* Quit if the user selected the Quit option or closed the window. */ should_quit = should_quit || test_command_table(&command_table, COMMAND_QUIT, REPETITION_DELAY); } return 0; }
void display_cycle(void) { unsigned long counter; int ch; counter = loopDelay; while (--counter); if (!(cycle & keyDelay)) { #if defined(DJGPP) || defined(WATCOM) #if defined(DOSALLGRAPHX) if (displayMode == TEXT) #ifdef CONIOGRAPHX CacheScreenUpdate(Screen[CORE_PAGE]); #else ScreenUpdate((void *) Screen[CORE_PAGE]); #endif #else #if defined(DOSTXTGRAPHX) #ifdef CONIOGRAPHX CacheScreenUpdate(Screen[CORE_PAGE]); #else ScreenUpdate((void *) Screen[CORE_PAGE]); #endif #endif /* DOSTXTGRAPHX */ #endif /* DOSALLGRAPHX */ #endif /* DJGPP */ #if defined(DOSALLGRAPHX) if (displayMode != TEXT) bgi_update_cycle_meter(); #else #if defined(DOSGRXGRAPHX) bgi_update_cycle_meter(); #endif #endif if (KEYPRESSED && !inputRedirection) { switch (ch = getch()) { case '0': displayLevel = 0; break; case '1': displayLevel = 1; break; case '2': displayLevel = 2; break; case '3': displayLevel = 3; break; case '4': displayLevel = 4; break; case 'd': debugState = STEP; /* stepping = FALSE; */ break; case '>': if (displaySpeed > 0) { --displaySpeed; loopDelay = loopDelayAr[displaySpeed]; keyDelay = keyDelayAr[displaySpeed]; } break; case '<': if (displaySpeed < SPEEDLEVELS - 1) { ++displaySpeed; loopDelay = loopDelayAr[displaySpeed]; keyDelay = keyDelayAr[displaySpeed]; } break; case ' ': case 'r': #if defined(DOSALLGRAPHX) if (displayMode == TEXT) text_display_clear(); else bgi_clear_arena(); #else #if defined(DOSTXTGRAPHX) text_display_clear(); #else bgi_clear_arena(); #endif #endif break; case 27: /* escape */ case 'q': display_close(); Exit(USERABORT); #if defined(DOSALLGRAPHX) case 'v': if (displayMode == TEXT) displayMode = GRX; else bgi_display_close(NOWAIT); display_init(); break; #endif #if 0 #if defined(DOSALLGRAPHX) case '?': case 'h': if (displayMode == TEXT) disp_help(); break; #else #if defined(DOSTXTGRAPHX) case '?': case 'h': disp_help(); break; #endif #endif #endif /* 0 */ default: if (ch > 32 && ch < 128) ch += 128; ungetch(ch); debugState = STEP; break; } #if defined(DOSALLGRAPHX) if (displayMode != TEXT) write_menu(); #else #if defined(DOSGRXGRAPHX) write_menu(); #endif #endif } } }