// endian-swapping fread that dies if the expected amount cannot be read size_t efread( void *buffer, size_t size, size_t num, FILE *stream ) { size_t num_read = fread(buffer, size, num, stream); switch (size) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN case 2: for (size_t i = 0; i < num; i++) ((Uint16 *)buffer)[i] = SDL_Swap16(((Uint16 *)buffer)[i]); break; case 4: for (size_t i = 0; i < num; i++) ((Uint32 *)buffer)[i] = SDL_Swap32(((Uint32 *)buffer)[i]); break; case 8: for (size_t i = 0; i < num; i++) ((Uint64 *)buffer)[i] = SDL_Swap64(((Uint64 *)buffer)[i]); break; #endif default: break; } if (num_read != num) { fprintf(stderr, "error: An unexpected problem occurred while reading from a file.\n"); JE_tyrianHalt(1); } return num_read; }
// something has gone wrong :( void network_tyrian_halt( unsigned int err, bool attempt_sync ) { #ifdef __BLACKBERRY__ quit = true; #else const char *err_msg[] = { "Quitting...", "Other player quit the game.", "Network connection was lost.", "Network connection failed.", "Network version mismatch.", "Network delay mismatch.", "Network player number conflict.", }; quit = true; if (err >= COUNTOF(err_msg)) err = 0; fade_black(10); VGAScreen = VGAScreenSeg; JE_loadPic(VGAScreen, 2, false); JE_dString(VGAScreen, JE_fontCenter(err_msg[err], SMALL_FONT_SHAPES), 140, err_msg[err], SMALL_FONT_SHAPES); JE_showVGA(); fade_palette(colors, 10, 0, 255); if (attempt_sync) { while (!network_is_sync() && network_is_alive()) { service_SDL_events(false); network_check(); SDL_Delay(16); } } if (err) { while (!JE_anyButton()) SDL_Delay(16); } fade_black(10); SDLNet_Quit(); JE_tyrianHalt(5); #endif }
// die when dir_fopen fails FILE *dir_fopen_die( const char *dir, const char *file, const char *mode ) { FILE *f = dir_fopen(dir, file, mode); if (f == NULL) { fprintf(stderr, "error: failed to open '%s': %s\n", file, strerror(errno)); fprintf(stderr, "error: One or more of the required Tyrian " TYRIAN_VERSION " data files could not be found.\n" " Please read the README file.\n"); JE_tyrianHalt(1); } return f; }
// endian-swapping fwrite that dies if the expected amount cannot be written size_t efwrite( const void *buffer, size_t size, size_t num, FILE *stream ) { void *swap_buffer = NULL; switch (size) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN case 2: swap_buffer = malloc(size * num); for (size_t i = 0; i < num; i++) ((Uint16 *)swap_buffer)[i] = SDL_SwapLE16(((Uint16 *)buffer)[i]); buffer = swap_buffer; break; case 4: swap_buffer = malloc(size * num); for (size_t i = 0; i < num; i++) ((Uint32 *)swap_buffer)[i] = SDL_SwapLE32(((Uint32 *)buffer)[i]); buffer = swap_buffer; break; case 8: swap_buffer = malloc(size * num); for (size_t i = 0; i < num; i++) ((Uint64 *)swap_buffer)[i] = SDL_SwapLE64(((Uint64 *)buffer)[i]); buffer = swap_buffer; break; #endif default: break; } size_t num_written = fwrite(buffer, size, num, stream); if (swap_buffer != NULL) free(swap_buffer); if (num_written != num) { fprintf(stderr, "error: An unexpected problem occurred while writing to a file.\n"); JE_tyrianHalt(1); } return num_written; }
int main( int argc, char *argv[] ) { mt_srand(time(NULL)); printf("\nWelcome to... >> %s %s <<\n\n", opentyrian_str, opentyrian_version); printf("Copyright (C) 2007-2009 The OpenTyrian Development Team\n\n"); printf("This program comes with ABSOLUTELY NO WARRANTY.\n"); printf("This is free software, and you are welcome to redistribute it\n"); printf("under certain conditions. See the file GPL.txt for details.\n\n"); if (SDL_Init(0)) { printf("Failed to initialize SDL: %s\n", SDL_GetError()); return -1; } JE_loadConfiguration(); xmas = xmas_time(); // arg handler may override JE_paramCheck(argc, argv); JE_scanForEpisodes(); init_video(); init_keyboard(); init_joysticks(); printf("assuming mouse detected\n"); // SDL can't tell us if there isn't one if (xmas && (!dir_file_exists(data_dir(), "tyrianc.shp") || !dir_file_exists(data_dir(), "voicesc.snd"))) { xmas = false; fprintf(stderr, "warning: Christmas is missing.\n"); } JE_loadPals(); JE_loadMainShapeTables(xmas ? "tyrianc.shp" : "tyrian.shp"); if (xmas && !xmas_prompt()) { xmas = false; free_main_shape_tables(); JE_loadMainShapeTables("tyrian.shp"); } /* Default Options */ youAreCheating = false; smoothScroll = true; loadDestruct = false; if (!audio_disabled) { printf("initializing SDL audio...\n"); init_audio(); load_music(); JE_loadSndFile("tyrian.snd", xmas ? "voicesc.snd" : "voices.snd"); } else { printf("audio disabled\n"); } if (record_demo) printf("demo recording enabled (input limited to keyboard)\n"); JE_loadExtraShapes(); /*Editship*/ JE_loadHelpText(); /*debuginfo("Help text complete");*/ if (isNetworkGame) { #ifdef WITH_NETWORK if (network_init()) { network_tyrian_halt(3, false); } #else fprintf(stderr, "OpenTyrian was compiled without networking support."); JE_tyrianHalt(5); #endif } #ifdef NDEBUG if (!isNetworkGame) intro_logos(); #endif for (; ; ) { JE_initPlayerData(); JE_sortHighScores(); if (JE_titleScreen(true)) break; // user quit from title screen if (loadDestruct) { JE_destructGame(); loadDestruct = false; } else { JE_main(); } } JE_tyrianHalt(0); return 0; }
static void retro_deinit(void) { JE_tyrianHalt(0); }
static bool retro_load_game(int argc, char *argv[] ) { if (SDL_Init(0)) { printf("Failed to initialize SDL: %s\n", SDL_GetError()); return false; } JE_loadConfiguration(); xmas = xmas_time(); // arg handler may override JE_paramCheck(argc, argv); JE_scanForEpisodes(); init_video(); init_keyboard(); init_joysticks(); printf("assuming mouse detected\n"); // SDL can't tell us if there isn't one if (xmas && (!dir_file_exists(data_dir(), "tyrianc.shp") || !dir_file_exists(data_dir(), "voicesc.snd"))) { xmas = false; fprintf(stderr, "warning: Christmas is missing.\n"); } JE_loadPals(); JE_loadMainShapeTables(xmas ? "tyrianc.shp" : "tyrian.shp"); if (xmas && !xmas_prompt()) { xmas = false; free_main_shape_tables(); JE_loadMainShapeTables("tyrian.shp"); } /* Default Options */ youAreCheating = false; smoothScroll = true; loadDestruct = false; if (!audio_disabled) { printf("initializing SDL audio...\n"); init_audio(); load_music(); JE_loadSndFile("tyrian.snd", xmas ? "voicesc.snd" : "voices.snd"); } else { printf("audio disabled\n"); } if (record_demo) printf("demo recording enabled (input limited to keyboard)\n"); JE_loadExtraShapes(); /*Editship*/ JE_loadHelpText(); /*debuginfo("Help text complete");*/ if (isNetworkGame) { #ifdef WITH_NETWORK if (network_init()) { network_tyrian_halt(3, false); } #else fprintf(stderr, "OpenTyrian was compiled without networking support."); JE_tyrianHalt(5); #endif } #ifdef NDEBUG if (!isNetworkGame) intro_logos(); #endif return true; }
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; } } }