void init_video( void ) { /*if (SDL_WasInit(SDL_INIT_VIDEO)) return; if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "error: failed to initialize SDL video: %s\n", SDL_GetError()); exit(1); }*/ // SDL_WM_SetCaption("OpenTyrian", NULL); VGAScreen = VGAScreenSeg = SDL_CreateRGBSurface(SDL_SWSURFACE, vga_width, vga_height, 8, 0, 0, 0, 0); VGAScreen2 = SDL_CreateRGBSurface(SDL_SWSURFACE, vga_width, vga_height, 8, 0, 0, 0, 0); game_screen = SDL_CreateRGBSurface(SDL_SWSURFACE, vga_width, vga_height, 8, 0, 0, 0, 0); SDL_FillRect(VGAScreen, NULL, 0); scaler = 0; fullscreen_enabled = true; if (!init_scaler(scaler, fullscreen_enabled) && // try desired scaler and desired fullscreen state !init_any_scaler(fullscreen_enabled) && // try any scaler in desired fullscreen state !init_any_scaler(!fullscreen_enabled)) // try any scaler in other fullscreen state { //exit(EXIT_FAILURE); exit(1); } }
void opentyrian_menu( void ) { static const char *menu_items[] = { "About OpenTyrian", "Toggle Fullscreen", "Scaler: None", // "Play Destruct", "Jukebox", "Return to Main Menu", }; bool menu_items_disabled[] = { false, !can_init_any_scaler(false) || !can_init_any_scaler(true), false, // false, false, false, }; fade_black(10); JE_loadPic(VGAScreen, 13, false); draw_font_hv(VGAScreen, VGAScreen->w / 2, 5, opentyrian_str, large_font, centered, 15, -3); memcpy(VGAScreen2->pixels, VGAScreen->pixels, VGAScreen2->pitch * VGAScreen2->h); JE_showVGA(); play_song(36); // A Field for Mag int sel = 0; const int maxSel = COUNTOF(menu_items) - 1; uint32_t temp_scaler = scaler; bool fade_in = true, quit = false; do { memcpy(VGAScreen->pixels, VGAScreen2->pixels, VGAScreen->pitch * VGAScreen->h); for (int i = 0; i <= maxSel; i++) { const char *text = menu_items[i]; char buffer[100]; if (i == 2) /* Scaler */ { snprintf(buffer, sizeof(buffer), "Scaler: %s", scalers[temp_scaler].name); text = buffer; } int y = i != maxSel ? i * 16 + 32 : 118; draw_font_hv(VGAScreen, VGAScreen->w / 2, y, text, normal_font, centered, 15, menu_items_disabled[i] ? -8 : i != sel ? -4 : -2); } JE_showVGA(); if (fade_in) { fade_in = false; fade_palette(colors, 20, 0, 255); wait_noinput(true, false, false); } tempW = 0; JE_textMenuWait(&tempW, false); if (newkey) { switch (lastkey_sym) { case SDLK_UP: do { if (--sel < 0) sel = maxSel; } while (menu_items_disabled[sel]); JE_playSampleNum(S_CURSOR); break; case SDLK_DOWN: do { if (++sel > maxSel) sel = 0; } while (menu_items_disabled[sel]); JE_playSampleNum(S_CURSOR); break; case SDLK_LEFT: if (sel == 2) { do { if (temp_scaler == 0) temp_scaler = scalers_count; temp_scaler--; } while (!can_init_scaler(temp_scaler, fullscreen_enabled)); JE_playSampleNum(S_CURSOR); } break; case SDLK_RIGHT: if (sel == 2) { do { temp_scaler++; if (temp_scaler == scalers_count) temp_scaler = 0; } while (!can_init_scaler(temp_scaler, fullscreen_enabled)); JE_playSampleNum(S_CURSOR); } break; case SDLK_RETURN: switch (sel) { case 0: /* About */ JE_playSampleNum(S_SELECT); scroller_sine(about_text); memcpy(VGAScreen->pixels, VGAScreen2->pixels, VGAScreen->pitch * VGAScreen->h); JE_showVGA(); fade_in = true; break; case 1: /* Fullscreen */ JE_playSampleNum(S_SELECT); if (!init_scaler(scaler, !fullscreen_enabled) && // try new fullscreen state !init_any_scaler(!fullscreen_enabled) && // try any scaler in new fullscreen state !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } set_palette(colors, 0, 255); // for switching between 8 bpp scalers break; case 2: /* Scaler */ JE_playSampleNum(S_SELECT); if (scaler != temp_scaler) { if (!init_scaler(temp_scaler, fullscreen_enabled) && // try new scaler !init_scaler(temp_scaler, !fullscreen_enabled) && // try other fullscreen state !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } set_palette(colors, 0, 255); // for switching between 8 bpp scalers } break; case 3: /* Jukebox */ JE_playSampleNum(S_SELECT); fade_black(10); jukebox(); memcpy(VGAScreen->pixels, VGAScreen2->pixels, VGAScreen->pitch * VGAScreen->h); JE_showVGA(); fade_in = true; break; case 4: /* Return to main menu */ quit = true; JE_playSampleNum(S_SPRING); break; } break; case SDLK_ESCAPE: quit = true; JE_playSampleNum(S_SPRING); break; default: break; } } } while (!quit); }
void service_SDL_events( JE_boolean clear_new ) { SDL_Event ev; if (clear_new) newkey = newmouse = false; while (SDL_PollEvent(&ev)) { switch (ev.type) { case SDL_MOUSEMOTION: mouse_x = ev.motion.x * vga_width / scalers[scaler].width; mouse_y = ev.motion.y * vga_height / scalers[scaler].height; break; case SDL_KEYDOWN: if (ev.key.keysym.mod & KMOD_CTRL) { /* <ctrl><bksp> emergency kill */ if (ev.key.keysym.sym == SDLK_BACKSPACE) { puts("\n\n\nCtrl+Backspace pressed. Doing emergency quit.\n"); SDL_Quit(); exit(1); } /* <ctrl><f10> toggle input grab */ if (ev.key.keysym.sym == SDLK_F10) { input_grab_enabled = !input_grab_enabled; input_grab(); break; } } if (ev.key.keysym.mod & KMOD_ALT) { /* <alt><enter> toggle fullscreen */ if (ev.key.keysym.sym == SDLK_RETURN) { #ifdef __BLACKBERRY__ if (!init_scaler()) { exit(EXIT_FAILURE); } #else if (!init_scaler(scaler, !fullscreen_enabled) && // try new fullscreen state !init_any_scaler(!fullscreen_enabled) && // try any scaler in new fullscreen state !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } #endif break; } /* <alt><tab> disable input grab and fullscreen */ if (ev.key.keysym.sym == SDLK_TAB) { input_grab_enabled = false; input_grab(); #ifdef __BLACKBERRY__ if (!init_scaler()) { exit(EXIT_FAILURE); } #else if (!init_scaler(scaler, false) && // try windowed !init_any_scaler(false) && // try any scaler windowed !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } #endif break; } } newkey = true; lastkey_sym = ev.key.keysym.sym; lastkey_mod = ev.key.keysym.mod; lastkey_char = ev.key.keysym.unicode; keydown = true; return; case SDL_KEYUP: keydown = false; return; case SDL_MOUSEBUTTONDOWN: if(has_mouse) { if (!input_grabbed) { input_grab_enabled = !input_grab_enabled; input_grab(); break; } } /* no break */ case SDL_MOUSEBUTTONUP: if(has_mouse) { if (ev.type == SDL_MOUSEBUTTONDOWN) { newmouse = true; lastmouse_but = ev.button.button; lastmouse_x = ev.button.x * vga_width / scalers[scaler].width; lastmouse_y = ev.button.y * vga_height / scalers[scaler].height; mousedown = true; } else { mousedown = false; } switch (ev.button.button) { case SDL_BUTTON_LEFT: mouse_pressed[0] = mousedown; break; case SDL_BUTTON_RIGHT: mouse_pressed[1] = mousedown; break; case SDL_BUTTON_MIDDLE: mouse_pressed[2] = mousedown; break; } } break; case SDL_QUIT: /* TODO: Call the cleanup code here. */ #ifdef __BLACKBERRY__ JE_tyrianHalt(0); #else exit(0); #endif break; } } }
void opentyrian_menu( void ) { typedef enum { MENU_ABOUT = 0, MENU_FULLSCREEN, MENU_SCALER, // MENU_DESTRUCT, MENU_JUKEBOX, MENU_RETURN, MenuOptions_MAX } MenuOptions; static const char *menu_items[] = { "About OpenTyrian", "Toggle Fullscreen", "Scaler: None", // "Play Destruct", "Jukebox", "Return to Main Menu", }; bool menu_items_disabled[] = { false, !can_init_any_scaler(false) || !can_init_any_scaler(true), false, // false, false, false, }; assert(COUNTOF(menu_items) == MenuOptions_MAX); assert(COUNTOF(menu_items_disabled) == MenuOptions_MAX); fade_black(10); JE_loadPic(VGAScreen, 13, false); draw_font_hv(VGAScreen, VGAScreen->surf->w / 2, 5, opentyrian_str, large_font, centered, 15, -3); memcpy(VGAScreen2->surf->pixels, VGAScreen->surf->pixels, VGAScreen2->surf->pitch * VGAScreen2->surf->h); JE_showVGA(); play_song(36); // A Field for Mag MenuOptions sel = 0; uint temp_scaler = scaler; bool fade_in = true, quit = false; do { memcpy(VGAScreen->surf->pixels, VGAScreen2->surf->pixels, VGAScreen->surf->pitch * VGAScreen->surf->h); for (MenuOptions i = 0; i < MenuOptions_MAX; i++) { const char *text = menu_items[i]; char buffer[100]; if (i == MENU_SCALER) { snprintf(buffer, sizeof(buffer), "Scaler: %s", scalers[temp_scaler].name); text = buffer; } int y = i != MENU_RETURN ? i * 16 + 32 : 118; draw_font_hv(VGAScreen, VGAScreen->surf->w / 2, y, text, normal_font, centered, 15, menu_items_disabled[i] ? -8 : i != sel ? -4 : -2); } JE_showVGA(); if (fade_in) { fade_in = false; fade_palette(colors, 20, 0, 255); wait_noinput(true, false, false); } tempW = 0; JE_textMenuWait(&tempW, false); if (newkey) { switch (lastkey_sym) { case SDLK_UP: do { if (sel-- == 0) sel = MenuOptions_MAX - 1; } while (menu_items_disabled[sel]); JE_playSampleNum(S_CURSOR); break; case SDLK_DOWN: do { if (++sel >= MenuOptions_MAX) sel = 0; } while (menu_items_disabled[sel]); JE_playSampleNum(S_CURSOR); break; case SDLK_LEFT: if (sel == MENU_SCALER) { do { if (temp_scaler == 0) temp_scaler = scalers_count; temp_scaler--; } while (!can_init_scaler(temp_scaler, fullscreen_enabled)); JE_playSampleNum(S_CURSOR); } break; case SDLK_RIGHT: if (sel == MENU_SCALER) { do { temp_scaler++; if (temp_scaler == scalers_count) temp_scaler = 0; } while (!can_init_scaler(temp_scaler, fullscreen_enabled)); JE_playSampleNum(S_CURSOR); } break; case SDLK_RETURN: switch (sel) { case MENU_ABOUT: JE_playSampleNum(S_SELECT); scroller_sine(about_text); memcpy(VGAScreen->surf->pixels, VGAScreen2->surf->pixels, VGAScreen->surf->pitch * VGAScreen->surf->h); JE_showVGA(); fade_in = true; break; case MENU_FULLSCREEN: JE_playSampleNum(S_SELECT); if (!init_scaler(scaler, !fullscreen_enabled) && // try new fullscreen state !init_any_scaler(!fullscreen_enabled) && // try any scaler in new fullscreen state !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } break; case MENU_SCALER: JE_playSampleNum(S_SELECT); if (scaler != temp_scaler) { if (!init_scaler(temp_scaler, fullscreen_enabled) && // try new scaler !init_scaler(temp_scaler, !fullscreen_enabled) && // try other fullscreen state !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } } break; case MENU_JUKEBOX: JE_playSampleNum(S_SELECT); fade_black(10); jukebox(); memcpy(VGAScreen->surf->pixels, VGAScreen2->surf->pixels, VGAScreen->surf->pitch * VGAScreen->surf->h); JE_showVGA(); fade_in = true; break; case MENU_RETURN: quit = true; JE_playSampleNum(S_SPRING); break; case MenuOptions_MAX: assert(false); break; } break; case SDLK_ESCAPE: quit = true; JE_playSampleNum(S_SPRING); break; default: break; } } } while (!quit); }
void service_SDL_events( JE_boolean clear_new ) { SDL_Event ev; if (clear_new) newkey = newmouse = false; while (SDL_PollEvent(&ev)) { switch (ev.type) { case SDL_ACTIVEEVENT: if (ev.active.state == SDL_APPINPUTFOCUS && !ev.active.gain) input_grab(false); break; case SDL_MOUSEMOTION: mouse_x = ev.motion.x * vga_width / scalers[scaler].width; mouse_y = ev.motion.y * vga_height / scalers[scaler].height; break; case SDL_KEYDOWN: if (handle_pause_key && ev.key.keysym.sym == SDLK_PAUSE) { JE_boolean superPause_save = superPause; superPause = true; JE_pauseGame(); superPause = superPause_save; break; } if (ev.key.keysym.mod & KMOD_CTRL) { /* <ctrl><bksp> emergency kill */ if (ev.key.keysym.sym == SDLK_BACKSPACE) { puts("\n\n\nCtrl+Backspace pressed. Doing emergency quit.\n"); SDL_Quit(); exit(1); } /* <ctrl><f10> toggle input grab */ if (ev.key.keysym.sym == SDLK_F10) { input_grab(!input_grab_enabled); break; } } if (ev.key.keysym.mod & KMOD_ALT) { /* <alt><enter> toggle fullscreen */ if (ev.key.keysym.sym == SDLK_RETURN) { if (!init_scaler(scaler, !fullscreen_enabled) && // try new fullscreen state !init_any_scaler(!fullscreen_enabled) && // try any scaler in new fullscreen state !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } break; } /* <alt><tab> disable input grab and fullscreen */ if (ev.key.keysym.sym == SDLK_TAB) { if (!init_scaler(scaler, false) && // try windowed !init_any_scaler(false) && // try any scaler windowed !init_scaler(scaler, fullscreen_enabled)) // revert on fail { exit(EXIT_FAILURE); } input_grab(false); break; } } keysactive[ev.key.keysym.sym] = 1; newkey = true; lastkey_sym = ev.key.keysym.sym; lastkey_mod = ev.key.keysym.mod; lastkey_char = ev.key.keysym.unicode; keydown = true; return; case SDL_KEYUP: keysactive[ev.key.keysym.sym] = 0; keydown = false; return; case SDL_MOUSEBUTTONDOWN: if (!input_grab_enabled) { input_grab(true); break; } // intentional fall-though case SDL_MOUSEBUTTONUP: if (ev.type == SDL_MOUSEBUTTONDOWN) { newmouse = true; lastmouse_but = ev.button.button; lastmouse_x = ev.button.x * vga_width / scalers[scaler].width; lastmouse_y = ev.button.y * vga_height / scalers[scaler].height; mousedown = true; } else { mousedown = false; } switch (ev.button.button) { case SDL_BUTTON_LEFT: mouse_pressed[0] = mousedown; break; case SDL_BUTTON_RIGHT: mouse_pressed[1] = mousedown; break; case SDL_BUTTON_MIDDLE: mouse_pressed[2] = mousedown; break; } break; case SDL_QUIT: /* TODO: Call the cleanup code here. */ exit(0); break; } } }