X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=e3bdd9c8f33fe0ca3f351f13cc0e9a294ecc5ada;hb=d6a1a6cb31174ac804f9ad54a919d65478da588f;hp=e239da9d81b38be5b0566c32ac860188fcc9ce23;hpb=8848a001bf529a3e06710b80b928094e48f25aa8;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index e239da9d..e3bdd9c8 100644 --- a/src/init.c +++ b/src/init.c @@ -38,9 +38,6 @@ #define CONFIG_TOKEN_FONT_INITIAL "font.initial" #define CONFIG_TOKEN_GLOBAL_BUSY "global.busy" -#define DEBUG_PRINT_INIT_TIMESTAMPS TRUE -#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 1 - static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS]; static struct GraphicInfo anim_initial; @@ -89,78 +86,12 @@ static int copy_properties[][5] = }; -static void print_timestamp_ext(char *message, char *mode) -{ -#if DEBUG -#if DEBUG_PRINT_INIT_TIMESTAMPS - static char *debug_message = NULL; - static char *last_message = NULL; - static int counter_nr = 0; - int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH; - - checked_free(debug_message); - debug_message = getStringCat3(mode, " ", message); - - if (strEqual(mode, "INIT")) - { - debug_print_timestamp(counter_nr, NULL); - - if (counter_nr + 1 < max_depth) - debug_print_timestamp(counter_nr, debug_message); - - counter_nr++; - - debug_print_timestamp(counter_nr, NULL); - } - else if (strEqual(mode, "DONE")) - { - counter_nr--; - - if (counter_nr + 1 < max_depth || - (counter_nr == 0 && max_depth == 1)) - { - last_message = message; - - if (counter_nr == 0 && max_depth == 1) - { - checked_free(debug_message); - debug_message = getStringCat3("TIME", " ", message); - } - - debug_print_timestamp(counter_nr, debug_message); - } - } - else if (!strEqual(mode, "TIME") || - !strEqual(message, last_message)) - { - if (counter_nr < max_depth) - debug_print_timestamp(counter_nr, debug_message); - } -#endif -#endif -} - -static void print_timestamp_init(char *message) -{ - print_timestamp_ext(message, "INIT"); -} - -static void print_timestamp_time(char *message) -{ - print_timestamp_ext(message, "TIME"); -} - -static void print_timestamp_done(char *message) -{ - print_timestamp_ext(message, "DONE"); -} - void DrawInitAnim() { struct GraphicInfo *graphic_info_last = graphic_info; int graphic = 0; - static unsigned long action_delay = 0; - unsigned long action_delay_value = GameFrameDelay; + static unsigned int action_delay = 0; + unsigned int action_delay_value = GameFrameDelay; int sync_frame = FrameCounter; int x, y; @@ -175,9 +106,9 @@ void DrawInitAnim() #if 0 { - static unsigned long last_counter = -1; - unsigned long current_counter = Counter(); - unsigned long delay = current_counter - last_counter; + static unsigned int last_counter = -1; + unsigned int current_counter = Counter(); + unsigned int delay = current_counter - last_counter; if (last_counter != -1 && delay > action_delay_value + 5) printf("::: DrawInitAnim: DELAY TOO LONG: %ld\n", delay); @@ -1196,7 +1127,6 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type) if (strEqual(value_raw, ARG_UNDEFINED)) return ARG_UNDEFINED_VALUE; -#if 1 if (type == TYPE_ELEMENT) { char *value = getHashEntry(element_token_hash, value_raw); @@ -1210,36 +1140,6 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type) return (value != NULL ? atoi(value) : IMG_UNDEFINED); } -#else - - int i; - int x = 0; - - /* !!! THIS IS BUGGY !!! NOT SURE IF YOU GET ELEMENT ID OR GRAPHIC ID !!! */ - /* !!! (possible reason why ".clone_from" with elements doesn't work) !!! */ - - /* !!! OPTIMIZE THIS BY USING HASH !!! */ - for (i = 0; i < MAX_NUM_ELEMENTS; i++) - if (strEqual(element_info[i].token_name, value_raw)) - return i; - - /* !!! OPTIMIZE THIS BY USING HASH !!! */ - for (i = 0; image_config[i].token != NULL; i++) - { - int len_config_value = strlen(image_config[i].value); - - if (!strEqual(&image_config[i].value[len_config_value - 4], ".pcx") && - !strEqual(&image_config[i].value[len_config_value - 4], ".wav") && - !strEqual(image_config[i].value, UNDEFINED_FILENAME)) - continue; - - if (strEqual(image_config[i].token, value_raw)) - return x; - - x++; - } -#endif - return -1; } @@ -1857,7 +1757,7 @@ static void InitGraphicInfo() static boolean clipmasks_initialized = FALSE; Pixmap src_pixmap; XGCValues clip_gc_values; - unsigned long clip_gc_valuemask; + unsigned int clip_gc_valuemask; GC copy_clipmask_gc = None; #endif @@ -5059,7 +4959,8 @@ static void InitGlobal() /* create hash from graphic token list */ graphic_token_hash = newSetupFileHash(); for (graphic = 0, i = 0; image_config[i].token != NULL; i++) - if (strSuffix(image_config[i].value, ".pcx") || + if (strSuffix(image_config[i].value, ".png") || + strSuffix(image_config[i].value, ".pcx") || strSuffix(image_config[i].value, ".wav") || strEqual(image_config[i].value, UNDEFINED_FILENAME)) setHashEntry(graphic_token_hash, @@ -5313,6 +5214,7 @@ void Execute_Command(char *command) #if DEBUG #if defined(TARGET_SDL) +#if !defined(TARGET_SDL2) else if (strEqual(command, "SDL_ListModes")) { SDL_Rect **modes; @@ -5347,6 +5249,7 @@ void Execute_Command(char *command) exit(0); } #endif +#endif #endif else @@ -6274,6 +6177,63 @@ void KeyboardAutoRepeatOffUnlessAutoplay() KeyboardAutoRepeatOff(); } +void DisplayExitMessage(char *format, va_list ap) +{ + // check if draw buffer and fonts for exit message are already available + if (drawto == NULL || font_initial[NUM_INITIAL_FONTS - 1].bitmap == NULL) + return; + + int font_1 = FC_RED; + int font_2 = FC_YELLOW; + int font_3 = FC_BLUE; + int font_width = getFontWidth(font_2); + int font_height = getFontHeight(font_2); + int sx = SX; + int sy = SY; + int sxsize = WIN_XSIZE - 2 * sx; + int sysize = WIN_YSIZE - 2 * sy; + int line_length = sxsize / font_width; + int max_lines = sysize / font_height; + int num_lines_printed; + + gfx.sx = sx; + gfx.sy = sy; + gfx.sxsize = sxsize; + gfx.sysize = sysize; + + sy = 20; + + ClearRectangle(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE); + + DrawTextSCentered(sy, font_1, "Fatal error:"); + sy += 3 * font_height;; + + num_lines_printed = + DrawTextBufferVA(sx, sy, format, ap, font_2, + line_length, line_length, max_lines, + 0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE); + sy += (num_lines_printed + 3) * font_height; + + DrawTextSCentered(sy, font_1, "For details, see the following error file:"); + sy += 3 * font_height; + + num_lines_printed = + DrawTextBuffer(sx, sy, program.error_filename, font_2, + line_length, line_length, max_lines, + 0, BLIT_ON_BACKGROUND, TRUE, TRUE, FALSE); + + DrawTextSCentered(SYSIZE - 20, font_3, "Press any key or button to exit"); + + redraw_mask = REDRAW_ALL; + + BackToFront(); + + /* deactivate toons on error message screen */ + setup.toons = FALSE; + + WaitForEventToContinue(); +} + /* ========================================================================= */ /* OpenAll() */ @@ -6336,7 +6296,7 @@ void OpenAll() InitVideoDisplay(); InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); - InitEventFilter(FilterMouseMotionEvents); + InitEventFilter(FilterEvents); print_timestamp_time("[init video stuff]"); @@ -6412,6 +6372,24 @@ void OpenAll() DrawMainMenu(); InitNetworkServer(); + +#if 0 + Error(ERR_DEBUG, "::: SDL_GetBasePath() == '%s'", + SDL_GetBasePath()); + Error(ERR_DEBUG, "::: SDL_GetPrefPath() == '%s'", + SDL_GetPrefPath("artsoft", "rocksndiamonds")); +#if defined(PLATFORM_ANDROID) + Error(ERR_DEBUG, "::: SDL_AndroidGetInternalStoragePath() == '%s'", + SDL_AndroidGetInternalStoragePath()); + Error(ERR_DEBUG, "::: SDL_AndroidGetExternalStoragePath() == '%s'", + SDL_AndroidGetExternalStoragePath()); + Error(ERR_DEBUG, "::: SDL_AndroidGetExternalStorageState() == '%s'", + (SDL_AndroidGetExternalStorageState() == + SDL_ANDROID_EXTERNAL_STORAGE_READ ? "read" : + SDL_AndroidGetExternalStorageState() == + SDL_ANDROID_EXTERNAL_STORAGE_WRITE ? "write" : "not available")); +#endif +#endif } void CloseAllAndExit(int exit_value) @@ -6432,15 +6410,28 @@ void CloseAllAndExit(int exit_value) FreeAllImages(); #if defined(TARGET_SDL) +#if defined(TARGET_SDL2) + // !!! TODO !!! + // set a flag to tell the network server thread to quit and wait for it + // using SDL_WaitThread() +#else if (network_server) /* terminate network server */ SDL_KillThread(server_thread); +#endif #endif CloseVideoDisplay(); ClosePlatformDependentStuff(); if (exit_value != 0) - NotifyUserAboutErrorFile(); + { + /* fall back to default level set (current set may have caused an error) */ + SaveLevelSetup_LastSeries_Deactivate(); + + /* tell user where to find error log file which may contain more details */ + // (error notification now directly displayed on screen inside R'n'D + // NotifyUserAboutErrorFile(); /* currently only works for Windows */ + } exit(exit_value); }