X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Feditor.c;h=0eea3c6da24218245c1a3c75980280f089e1b789;hb=c2a639c0b2c1a9a2bd14de86932a47429ae918a4;hp=26ec5f727430cbeca7182886237d636826339c32;hpb=fd2761fde6102017cd3be6b59c3be9140f96f703;p=rocksndiamonds.git diff --git a/src/editor.c b/src/editor.c index 26ec5f72..0eea3c6d 100644 --- a/src/editor.c +++ b/src/editor.c @@ -3136,6 +3136,35 @@ static void ReinitializeElementList() element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS; } +void PrintEditorElementList() +{ + boolean *stop = &setup.editor.el_user_defined; + int i, j; + + for (i=0; editor_elements_info[i].setup_value != stop; i++) + { + for (j=0; j < *editor_elements_info[i].headline_list_size; j++) + { + int element = (*editor_elements_info[i].headline_list)[j]; + + printf("# %s\n", element_info[element].token_name); + } + + if (j > 0) + printf("#\n"); + + for (j=0; j < *editor_elements_info[i].element_list_size; j++) + { + int element = (*editor_elements_info[i].element_list)[j]; + + printf("# %s\n", element_info[element].token_name); + } + + if (j > 0) + printf("#\n"); + } +} + static void ReinitializeElementListButtons() { static boolean last_setup_value_headlines = FALSE; @@ -5501,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); @@ -5567,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; @@ -5629,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++; @@ -5650,6 +5949,7 @@ static int PrintElementDescriptionFromFile(char *filename, int screen_line) return lines_printed; } +#endif static void DrawPropertiesTabulatorGadgets() {