From: Holger Schemel Date: Sat, 30 Aug 2014 09:00:08 +0000 (+0200) Subject: Merge branch 'master' into releases X-Git-Tag: 3.3.1.2^0 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=refs%2Fheads%2Freleases;hp=fc4457661dae8eae32f70060111e74924e0dbf4d Merge branch 'master' into releases --- diff --git a/ChangeLog b/ChangeLog index 7c0df045..2469c878 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2013-11-24 + * version 3.3.1.2 released + +2013-11-20 + * improved error handling: display error message on screen (not only in + the error file or on the console), and display path of the error file + +2013-11-13 + * fixed problem with R'n'D restarting with same level set that may have + caused a problem (and therefore failing again and again); after an + error, the last level set is now deactivated in file "levelsetup.conf" + to restart with default level set (which should work without error) + +2013-11-07 + * fixed determining main game data directory on Mac OS X "Mavericks" + +2013-11-04 + * version number set to 3.3.1.2 + 2013-11-04 * version 3.3.1.1 released diff --git a/Makefile b/Makefile index b2d8476c..8a51c93a 100644 --- a/Makefile +++ b/Makefile @@ -143,7 +143,7 @@ backup: backup-net-copy: ./Scripts/make_backup.sh src scp -backup-net: backup backup-net-copy +backup-all: backup backup-net-copy backup_lev: ./Scripts/make_backup.sh lev diff --git a/src/Makefile b/src/Makefile index 853c415b..a67cd14c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -327,13 +327,13 @@ clean: clean-obj clean-ico clean-bin # run and test targets # ----------------------------------------------------------------------------- -run: all +run: cd .. && ./$(PROGBASE) --verbose -gdb: all +gdb: cd .. && gdb -batch -x GDB_COMMANDS ./$(PROGBASE) -valgrind: all +valgrind: cd .. && valgrind -v --leak-check=yes ./$(PROGBASE) 2> valgrind.out diff --git a/src/config.c b/src/config.c index c812adfd..bb1c6ee4 100644 --- a/src/config.c +++ b/src/config.c @@ -71,15 +71,27 @@ char *getProgramInitString() { static char *program_init_string = NULL; +#if 1 + // do not display compile target anymore, as it is almost always "SDL" now if (program_init_string == NULL) { program_init_string = checked_malloc(strlen(PROGRAM_TITLE_STRING) + 1 + - strlen(getProgramVersionString()) +1 + + strlen(getProgramVersionString()) + 1); + + sprintf(program_init_string, "%s %s", + PROGRAM_TITLE_STRING, getProgramVersionString()); + } +#else + if (program_init_string == NULL) + { + program_init_string = checked_malloc(strlen(PROGRAM_TITLE_STRING) + 1 + + strlen(getProgramVersionString()) + 1 + strlen(TARGET_STRING) + 1); sprintf(program_init_string, "%s %s %s", PROGRAM_TITLE_STRING, getProgramVersionString(), TARGET_STRING); } +#endif return program_init_string; } diff --git a/src/conftime.h b/src/conftime.h index f0fbdec7..fd1449b6 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "2013-11-04 00:44" +#define COMPILE_DATE_STRING "2013-11-24 14:05" diff --git a/src/init.c b/src/init.c index f176e13e..a7ad871b 100644 --- a/src/init.c +++ b/src/init.c @@ -6274,6 +6274,59 @@ void KeyboardAutoRepeatOffUnlessAutoplay() KeyboardAutoRepeatOff(); } +void DisplayExitMessage(char *format, va_list ap) +{ + 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() */ @@ -6440,7 +6493,14 @@ void CloseAllAndExit(int exit_value) 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); } diff --git a/src/init.h b/src/init.h index 42bc9f74..d52aef4d 100644 --- a/src/init.h +++ b/src/init.h @@ -46,6 +46,8 @@ void KeyboardAutoRepeatOffUnlessAutoplay(); void InitGfxBuffers(); void InitGadgets(); +void DisplayExitMessage(char *, va_list); + void OpenAll(void); void CloseAllAndExit(int); diff --git a/src/libgame/macosx.h b/src/libgame/macosx.h index c4818e76..ddd9d4b1 100644 --- a/src/libgame/macosx.h +++ b/src/libgame/macosx.h @@ -15,6 +15,11 @@ #define MACOSX_H +/* define some Mac OS X specific paths */ + +#define MAC_APP_BINARY_SUBDIR "Contents/MacOS" + + /* some symbols are already defined on Mac OS X */ #define Delay Delay_internal #define DrawLine DrawLine_internal diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 60dbcf06..c196fe81 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -564,6 +564,36 @@ char *getBasePath(char *filename) return basepath; } +static char *getProgramMainDataPath() +{ + char *main_data_path = getStringCopy(program.command_basepath); + +#if defined(PLATFORM_MACOSX) + static char *main_data_binary_subdir = NULL; + + if (main_data_binary_subdir == NULL) + { + main_data_binary_subdir = checked_malloc(strlen(program.program_title) + 1 + + strlen("app") + 1 + + strlen(MAC_APP_BINARY_SUBDIR) + 1); + + sprintf(main_data_binary_subdir, "%s.app/%s", + program.program_title, MAC_APP_BINARY_SUBDIR); + } + + // cut relative path to Mac OS X application binary directory from path + if (strSuffix(main_data_path, main_data_binary_subdir)) + main_data_path[strlen(main_data_path) - + strlen(main_data_binary_subdir)] = '\0'; + + // cut trailing path separator from path (but not if path is root directory) + if (strSuffix(main_data_path, "/") && !strEqual(main_data_path, "/")) + main_data_path[strlen(main_data_path) - 1] = '\0'; +#endif + + return main_data_path; +} + /* ------------------------------------------------------------------------- */ /* various string functions */ @@ -721,6 +751,18 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) char *rw_base_path = RW_BASE_PATH; char **options_left = &argv[1]; +#if 1 + /* if the program is configured to start from current directory (default), + determine program package directory from program binary (some versions + of KDE/Konqueror and Mac OS X (especially "Mavericks") apparently do not + set the current working directory to the program package directory) */ + + if (strEqual(ro_base_path, ".")) + ro_base_path = getProgramMainDataPath(); + if (strEqual(rw_base_path, ".")) + rw_base_path = getProgramMainDataPath(); +#else + #if !defined(PLATFORM_MACOSX) /* if the program is configured to start from current directory (default), determine program package directory (KDE/Konqueror does not do this by @@ -732,6 +774,8 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) ro_base_path = program.command_basepath; if (strEqual(rw_base_path, ".")) rw_base_path = program.command_basepath; +#endif + #endif /* initialize global program options */ @@ -963,9 +1007,11 @@ void Error(int mode, char *format, ...) static boolean last_line_was_separator = FALSE; char *process_name = ""; +#if 1 /* display warnings only when running in verbose mode */ if (mode & ERR_WARN && !options.verbose) return; +#endif if (mode == ERR_INFO_LINE) { @@ -999,6 +1045,13 @@ void Error(int mode, char *format, ...) va_start(ap, format); vfprintf_newline(program.error_file, format, ap); va_end(ap); + + if ((mode & ERR_EXIT) && !(mode & ERR_FROM_SERVER)) + { + va_start(ap, format); + program.exit_message_function(format, ap); + va_end(ap); + } } if (mode & ERR_HELP) diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 246e3891..ac5b78d0 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -3951,7 +3951,7 @@ void LoadLevelSetup_LastSeries() free(filename); } -void SaveLevelSetup_LastSeries() +static void SaveLevelSetup_LastSeries_Ext(boolean deactivate_last_level_series) { /* ----------------------------------------------------------------------- */ /* ~/./levelsetup.conf */ @@ -3972,6 +3972,10 @@ void SaveLevelSetup_LastSeries() fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER, getCookie("LEVELSETUP"))); + + if (deactivate_last_level_series) + fprintf(file, "# %s\n# ", "the following level set may have caused a problem and was deactivated"); + fprintf(file, "%s\n", getFormattedSetupEntry(TOKEN_STR_LAST_LEVEL_SERIES, level_subdir)); @@ -3982,6 +3986,16 @@ void SaveLevelSetup_LastSeries() free(filename); } +void SaveLevelSetup_LastSeries() +{ + SaveLevelSetup_LastSeries_Ext(FALSE); +} + +void SaveLevelSetup_LastSeries_Deactivate() +{ + SaveLevelSetup_LastSeries_Ext(TRUE); +} + static void checkSeriesInfo() { static char *level_directory = NULL; diff --git a/src/libgame/setup.h b/src/libgame/setup.h index c667c348..61316bbd 100644 --- a/src/libgame/setup.h +++ b/src/libgame/setup.h @@ -317,6 +317,7 @@ void LoadLevelArtworkInfo(void); void LoadLevelSetup_LastSeries(void); void SaveLevelSetup_LastSeries(void); +void SaveLevelSetup_LastSeries_Deactivate(); void LoadLevelSetup_SeriesInfo(void); void SaveLevelSetup_SeriesInfo(void); diff --git a/src/libgame/system.c b/src/libgame/system.c index 51e8df89..6d99c7c8 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -105,6 +105,11 @@ void InitProgramInfo(char *argv0, program.error_file = stderr; } +void InitExitMessageFunction(void (*exit_message_function)(char *, va_list)) +{ + program.exit_message_function = exit_message_function; +} + void InitExitFunction(void (*exit_function)(int)) { program.exit_function = exit_function; @@ -129,9 +134,13 @@ void InitPlatformDependentStuff(void) updateUserGameDataDir(); #endif +#if 1 + openErrorFile(); +#else #if !defined(PLATFORM_UNIX) || defined(PLATFORM_MACOSX) openErrorFile(); #endif +#endif #if defined(TARGET_SDL) if (SDL_Init(SDL_INIT_EVENTTHREAD | SDL_INIT_NOPARACHUTE) < 0) diff --git a/src/libgame/system.h b/src/libgame/system.h index 98225eae..5c197691 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -651,9 +651,11 @@ typedef int (*EventFilter)(const Event *); struct ProgramInfo { - char *command_basepath; /* directory that contains the program */ + char *command_basepath; /* path to the program binary */ char *command_basename; /* base filename of the program binary */ + char *maindata_path; /* main game data (installation) directory */ + char *userdata_subdir; /* personal user game data directory */ char *userdata_subdir_unix; /* personal user game data directory (Unix) */ char *userdata_path; /* resulting full path to game data directory */ @@ -677,6 +679,7 @@ struct ProgramInfo int version_minor; int version_patch; + void (*exit_message_function)(char *, va_list); void (*exit_function)(int); }; @@ -1228,6 +1231,7 @@ extern int FrameCounter; void InitProgramInfo(char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, int); +void InitExitMessageFunction(void (*exit_message_function)(char *, va_list)); void InitExitFunction(void (*exit_function)(int)); void InitPlatformDependentStuff(void); void ClosePlatformDependentStuff(void); diff --git a/src/libgame/text.c b/src/libgame/text.c index 9d4d1193..dd926f62 100644 --- a/src/libgame/text.c +++ b/src/libgame/text.c @@ -947,6 +947,24 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr, return current_line; } +int DrawTextBufferVA(int x, int y, char *format, va_list ap, int font_nr, + int line_length, int cut_length, int max_lines, + int line_spacing, int mask_mode, boolean autowrap, + boolean centered, boolean parse_comments) +{ + char text_buffer[MAX_OUTPUT_LINESIZE]; + int text_length = vsnprintf(text_buffer, MAX_OUTPUT_LINESIZE, format, ap); + + if (text_length >= MAX_OUTPUT_LINESIZE) + Error(ERR_WARN, "string too long in DrawTextBufferVA() -- truncated"); + + int num_lines_printed = DrawTextBuffer(x, y, text_buffer, font_nr, + line_length, cut_length, max_lines, + line_spacing, mask_mode, autowrap, + centered, parse_comments); + return num_lines_printed; +} + int DrawTextFile(int x, int y, char *filename, int font_nr, int line_length, int cut_length, int max_lines, int line_spacing, int mask_mode, boolean autowrap, diff --git a/src/libgame/text.h b/src/libgame/text.h index 1d54a716..17d350a0 100644 --- a/src/libgame/text.h +++ b/src/libgame/text.h @@ -91,6 +91,8 @@ void DrawTextExt(DrawBuffer *, int, int, char *, int, int); char *GetTextBufferFromFile(char *, int); int DrawTextBuffer(int, int, char *, int, int, int, int, int, int, boolean, boolean, boolean); +int DrawTextBufferVA(int, int, char *, va_list, int, int, int, int, int, int, + boolean, boolean, boolean); int DrawTextFile(int, int, char *, int, int, int, int, int, int, boolean, boolean, boolean); diff --git a/src/main.c b/src/main.c index 94c5c3ac..aaa3a5ba 100644 --- a/src/main.c +++ b/src/main.c @@ -5594,6 +5594,7 @@ int main(int argc, char *argv[]) MSDOS_POINTER_FILENAME, COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL); + InitExitMessageFunction(DisplayExitMessage); InitExitFunction(CloseAllAndExit); InitPlatformDependentStuff(); diff --git a/src/main.h b/src/main.h index 738e39b9..a35337cf 100644 --- a/src/main.h +++ b/src/main.h @@ -2066,7 +2066,7 @@ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 3 #define PROGRAM_VERSION_PATCH 1 -#define PROGRAM_VERSION_BUILD 1 +#define PROGRAM_VERSION_BUILD 2 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel"