From: Holger Schemel Date: Sat, 29 Nov 2003 00:50:16 +0000 (+0100) Subject: rnd-20031129-1-src X-Git-Tag: 3.0.8^2~14 X-Git-Url: https://git.artsoft.org/?a=commitdiff_plain;h=c2a639c0b2c1a9a2bd14de86932a47429ae918a4;p=rocksndiamonds.git rnd-20031129-1-src --- diff --git a/src/conftime.h b/src/conftime.h index 21932cea..8fb097a7 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2003-11-28 03:02]" +#define COMPILE_DATE_STRING "[2003-11-29 01:44]" diff --git a/src/editor.c b/src/editor.c index cb202d16..0eea3c6d 100644 --- a/src/editor.c +++ b/src/editor.c @@ -5530,6 +5530,264 @@ char *getElementDescriptionFilename(int element) return NULL; } +#if 1 +static boolean PrintInfoText(char *text, int font_nr, int start_line) +{ + int font_height = getFontHeight(font_nr); + int pad_x = ED_SETTINGS_XPOS(0); + int pad_y = ED_SETTINGS_YPOS(0) + ED_BORDER_SIZE; + int sx = SX + pad_x; + int sy = SY + pad_y; + int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; + + if (start_line >= max_lines_per_screen) + return FALSE; + + DrawText(sx, sy + start_line * font_height, text, font_nr); + + return TRUE; +} + +#if 1 + +static int PrintElementDescriptionFromFile(char *filename, int start_line) +{ + int font_nr = FONT_TEXT_2; + int font_width = getFontWidth(font_nr); + int font_height = getFontHeight(font_nr); + int pad_x = ED_SETTINGS_XPOS(0); + int pad_y = ED_SETTINGS_YPOS(0) + ED_BORDER_SIZE; + int sx = SX + pad_x; + int sy = SY + pad_y; + int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; + int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; + int current_line = start_line; + char line[MAX_LINE_LEN]; + char buffer[max_chars_per_line + 1]; + int buffer_len; + FILE *file; + + if (current_line >= max_lines_per_screen) + return 0; + + if (filename == NULL) + return 0; + + if (!(file = fopen(filename, MODE_READ))) + return 0; + + buffer[0] = '\0'; + buffer_len = 0; + + while(!feof(file) && current_line < max_lines_per_screen) + { + char *line_ptr; + boolean last_line_was_empty = TRUE; + + /* read next line of input file */ + if (!fgets(line, MAX_LINE_LEN, file)) + break; + + /* skip comments (lines directly beginning with '#') */ + if (line[0] == '#') + continue; + + /* cut trailing newline from input line */ + for (line_ptr = line; *line_ptr; line_ptr++) + { + if (*line_ptr == '\n' || *line_ptr == '\r') + { + *line_ptr = '\0'; + break; + } + } + + if (strlen(line) == 0) /* special case: force empty line */ + strcpy(line, "\n"); + + line_ptr = line; + + while (*line_ptr && current_line < max_lines_per_screen) + { + boolean buffer_filled = RenderLineToBuffer(&line_ptr, + buffer, &buffer_len, + last_line_was_empty, + max_chars_per_line); + if (buffer_filled) + { + DrawText(sx, sy + current_line * font_height, buffer, font_nr); + current_line++; + + last_line_was_empty = (buffer_len == 0); + + buffer[0] = '\0'; + buffer_len = 0; + } + } + } + + fclose(file); + + if (buffer_len > 0 && current_line < max_lines_per_screen) + { + DrawText(sx, sy + current_line * font_height, buffer, font_nr); + current_line++; + } + + return (current_line - start_line); +} + +#else + +static int PrintElementDescriptionFromFile(char *filename, int start_line) +{ + int font_nr = FONT_TEXT_2; + int font_width = getFontWidth(font_nr); + int font_height = getFontHeight(font_nr); + int pad_x = ED_SETTINGS_XPOS(0); + int pad_y = ED_SETTINGS_YPOS(0) + ED_BORDER_SIZE; + int sx = SX + pad_x; + int sy = SY + pad_y; + int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width; + int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1; + int current_line = start_line; + char line[MAX_LINE_LEN]; + char buffer[max_chars_per_line + 1]; + int buffer_len; + FILE *file; + + if (filename == NULL) + return 0; + + if (!(file = fopen(filename, MODE_READ))) + return 0; + + buffer[0] = '\0'; + buffer_len = 0; + + while(!feof(file)) + { + char *line_ptr, *word_ptr; + boolean last_line_was_empty = TRUE; + + /* read next line of input file */ + if (!fgets(line, MAX_LINE_LEN, file)) + break; + + /* skip comments (lines directly beginning with '#') */ + if (line[0] == '#') + continue; + + /* cut trailing newline from input line */ + for (line_ptr = line; *line_ptr; line_ptr++) + { + if (*line_ptr == '\n' || *line_ptr == '\r') + { + *line_ptr = '\0'; + break; + } + } + + if (strlen(line) == 0) /* special case: force empty line */ + strcpy(line, "\n"); + + word_ptr = line; + + while (*word_ptr) + { + boolean print_buffer = FALSE; + int word_len; + + /* skip leading whitespaces */ + while (*word_ptr == ' ' || *word_ptr == '\t') + word_ptr++; + + line_ptr = word_ptr; + word_len = 0; + + /* look for end of next word */ + while (*line_ptr != ' ' && *line_ptr != '\t' && *line_ptr != '\0') + { + line_ptr++; + word_len++; + } + + if (word_len == 0) + { + continue; + } + else if (*word_ptr == '\n') /* special case: force empty line */ + { + if (buffer_len == 0) + word_ptr++; + + /* prevent printing of multiple empty lines */ + if (buffer_len > 0 || !last_line_was_empty) + print_buffer = TRUE; + } + else if (word_len < max_chars_per_line - buffer_len) + { + /* word fits into text buffer -- add word */ + + if (buffer_len > 0) + buffer[buffer_len++] = ' '; + + strncpy(&buffer[buffer_len], word_ptr, word_len); + buffer_len += word_len; + buffer[buffer_len] = '\0'; + word_ptr += word_len; + } + else if (buffer_len > 0) + { + /* not enough space left for word in text buffer -- print buffer */ + + print_buffer = TRUE; + } + else + { + /* word does not fit at all into empty text buffer -- cut word */ + + strncpy(buffer, word_ptr, max_chars_per_line); + buffer[max_chars_per_line] = '\0'; + word_ptr += max_chars_per_line; + print_buffer = TRUE; + } + + if (print_buffer) + { + if (current_line >= max_lines_per_screen) + { + fclose(file); + + return (current_line - start_line); + } + + DrawText(sx, sy + current_line * font_height, buffer, font_nr); + current_line++; + + last_line_was_empty = (buffer_len == 0); + + buffer[0] = '\0'; + buffer_len = 0; + print_buffer = FALSE; + } + } + } + + fclose(file); + + if (buffer_len > 0 && current_line < max_lines_per_screen) + { + DrawText(sx, sy + current_line * font_height, buffer, font_nr); + current_line++; + } + + return (current_line - start_line); +} +#endif + +#else + static boolean PrintInfoText(char *text, int font_nr, int screen_line) { int font_height = getFontHeight(font_nr); @@ -5596,6 +5854,10 @@ static int PrintElementDescriptionFromFile(char *filename, int screen_line) word_ptr = line; +#if 0 + printf("::: got line '%s'...\n", line); +#endif + while (*word_ptr) { boolean print_buffer = FALSE; @@ -5658,8 +5920,16 @@ static int PrintElementDescriptionFromFile(char *filename, int screen_line) if (print_buffer) { +#if 0 + printf("::: printing '%s'...\n", buffer); +#endif + if (!PrintInfoText(buffer, font_nr, screen_line + lines_printed)) + { + fclose(file); + return lines_printed; + } last_line_was_empty = (buffer_len == 0); lines_printed++; @@ -5679,6 +5949,7 @@ static int PrintElementDescriptionFromFile(char *filename, int screen_line) return lines_printed; } +#endif static void DrawPropertiesTabulatorGadgets() { diff --git a/src/files.c b/src/files.c index e65f387a..cb4c6a60 100644 --- a/src/files.c +++ b/src/files.c @@ -3236,30 +3236,25 @@ void LoadDemoAnimText() int i; if (demo_anim_text != NULL) - freeSetupFileList(demo_anim_text); + freeSetupFileHash(demo_anim_text); - if ((demo_anim_text = loadSetupFileList(filename)) == NULL) + if ((demo_anim_text = loadSetupFileHash(filename)) == NULL) { /* use reliable default values from static configuration */ - SetupFileList *insert_ptr; - - insert_ptr = demo_anim_text = - newSetupFileList(demo_anim_text_config[0].token, - demo_anim_text_config[0].value); + demo_anim_text = newSetupFileHash(); - for (i=1; demo_anim_text_config[i].token; i++) - insert_ptr = addListEntry(insert_ptr, - demo_anim_text_config[i].token, - demo_anim_text_config[i].value); + for (i=0; demo_anim_text_config[i].token; i++) + setHashEntry(demo_anim_text, demo_anim_text_config[i].token, + demo_anim_text_config[i].value); } #if 0 /* TEST ONLY */ + BEGIN_HASH_ITERATION(demo_anim_text, itr) { - SetupFileList *list; - - for (list = demo_anim_text; list != NULL; list = list->next) - printf("::: '%s' => '%s'\n", list->token, list->value); + printf("::: '%s' => '%s'\n", + HASH_ITERATION_TOKEN(itr), HASH_ITERATION_VALUE(itr)); } + END_HASH_ITERATION(hash, itr) #endif } diff --git a/src/libgame/setup.h b/src/libgame/setup.h index dcbc5eea..006a713a 100644 --- a/src/libgame/setup.h +++ b/src/libgame/setup.h @@ -67,7 +67,7 @@ struct TokenInfo /* some definitions for list and hash handling */ typedef struct SetupFileList SetupFileList; -typedef struct hashtable SetupFileHash; +typedef struct hashtable SetupFileHash; #define BEGIN_HASH_ITERATION(hash, itr) \ if (hash != NULL && hashtable_count(hash) > 0) \ diff --git a/src/libgame/text.c b/src/libgame/text.c index 9e955609..2c5b77bf 100644 --- a/src/libgame/text.c +++ b/src/libgame/text.c @@ -364,3 +364,103 @@ void DrawTextToTextArea(int x, int y, char *text, int font_nr, int line_length, redraw_mask |= REDRAW_FIELD; } + +boolean RenderLineToBuffer(char **src_buffer_ptr, char *dst_buffer, + int *dst_buffer_len, boolean last_line_was_empty, + int max_chars_per_line) +{ + char *text_ptr = *src_buffer_ptr; + char *buffer = dst_buffer; + int buffer_len = *dst_buffer_len; + boolean buffer_filled = FALSE; + + while (*text_ptr) + { + char *word_ptr; + int word_len; + + /* skip leading whitespaces */ + while (*text_ptr == ' ' || *text_ptr == '\t') + text_ptr++; + + word_ptr = text_ptr; + word_len = 0; + + /* look for end of next word */ + while (*word_ptr != ' ' && *word_ptr != '\t' && *word_ptr != '\0') + { + word_ptr++; + word_len++; + } + + if (word_len == 0) + { + continue; + } + else if (*text_ptr == '\n') /* special case: force empty line */ + { + if (buffer_len == 0) + text_ptr++; + + /* prevent printing of multiple empty lines */ + if (buffer_len > 0 || !last_line_was_empty) + buffer_filled = TRUE; + } + else if (word_len < max_chars_per_line - buffer_len) + { + /* word fits into text buffer -- add word */ + + if (buffer_len > 0) + buffer[buffer_len++] = ' '; + + strncpy(&buffer[buffer_len], text_ptr, word_len); + buffer_len += word_len; + buffer[buffer_len] = '\0'; + text_ptr += word_len; + } + else if (buffer_len > 0) + { + /* not enough space left for word in text buffer -- print buffer */ + + buffer_filled = TRUE; + } + else + { + /* word does not fit at all into empty text buffer -- cut word */ + + strncpy(buffer, text_ptr, max_chars_per_line); + buffer[max_chars_per_line] = '\0'; + text_ptr += max_chars_per_line; + buffer_filled = TRUE; + } + + if (buffer_filled) + break; + } + + *src_buffer_ptr = text_ptr; + *dst_buffer_len = buffer_len; + + return buffer_filled; +} + +void DrawTextWrapped(int x, int y, char *text, int font_nr, int line_length, + int max_lines) +{ + char *text_ptr = text; + char buffer[line_length + 1]; + int buffer_len; + int current_line = 0; + int font_height = getFontHeight(font_nr); + + while (*text_ptr && current_line < max_lines) + { + buffer[0] = '\0'; + buffer_len = 0; + + RenderLineToBuffer(&text_ptr, buffer, &buffer_len, TRUE, line_length); + + DrawText(x, y + current_line * font_height, buffer, font_nr); + current_line++; + } +} diff --git a/src/libgame/text.h b/src/libgame/text.h index 611cf2be..10c91d24 100644 --- a/src/libgame/text.h +++ b/src/libgame/text.h @@ -69,5 +69,7 @@ void DrawTextSCentered(int, int, char *); void DrawText(int, int, char *, int); void DrawTextExt(DrawBuffer *, int, int, char *, int, int); void DrawTextToTextArea(int, int, char *, int, int, int, int, int); +boolean RenderLineToBuffer(char **, char *, int *, boolean, int); +void DrawTextWrapped(int, int, char *, int, int, int); #endif /* TEXT_H */ diff --git a/src/main.c b/src/main.c index ef5d4b99..1754e225 100644 --- a/src/main.c +++ b/src/main.c @@ -106,7 +106,7 @@ struct SoundInfo *sound_info = NULL; struct MusicInfo *music_info = NULL; struct MusicFileInfo *music_file_info = NULL; struct DemoAnimInfo *demo_anim_info = NULL; -struct SetupFileList *demo_anim_text = NULL; +SetupFileHash *demo_anim_text = NULL; /* ------------------------------------------------------------------------- */ diff --git a/src/main.h b/src/main.h index 9f028d1d..ed85f13f 100644 --- a/src/main.h +++ b/src/main.h @@ -1668,7 +1668,7 @@ extern struct SoundInfo *sound_info; extern struct MusicInfo *music_info; extern struct MusicFileInfo *music_file_info; extern struct DemoAnimInfo *demo_anim_info; -extern struct SetupFileList *demo_anim_text; +extern SetupFileHash *demo_anim_text; extern struct ConfigInfo image_config[]; extern struct ConfigInfo sound_config[]; extern struct ConfigInfo music_config[]; diff --git a/src/screens.c b/src/screens.c index e47e922b..ec0a1231 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1007,7 +1007,8 @@ void DrawHelpScreenElText(int element, int action, int direction, int ypos) int ystep = TILEY + 4; char *text; - text = getListEntry(demo_anim_text, element_info[element].token_name); + text = getHashEntry(demo_anim_text, element_info[element].token_name); + if (text == NULL) { char token[MAX_LINE_LEN]; @@ -1020,15 +1021,31 @@ void DrawHelpScreenElText(int element, int action, int direction, int ypos) if (direction != -1) strcat(token, element_direction_info[MV_DIR_BIT(direction)].suffix); - text = getListEntry(demo_anim_text, token); + text = getHashEntry(demo_anim_text, token); if (text == NULL) - text = "[Oops! No Text found!]"; + text = "No description available"; } #if 1 + +#if 1 + + if (strlen(text) <= 34) + ystart += getFontHeight(FONT_TEXT_2) / 2; + +#if 0 + DrawTextWrapped(xstart, ystart+1 + ypos * ystep, text, FONT_LEVEL_NUMBER, + 34, 2); +#else + DrawTextWrapped(xstart, ystart+1 + ypos * ystep, text, FONT_TEXT_2, 34, 2); +#endif + +#else DrawTextToTextArea(xstart, ystart + ypos * ystep, text, FONT_TEXT_2, 34, 34, 2, BLIT_ON_BACKGROUND); +#endif + #else if (strlen(text) > 25) text[25] = '\0';