fixed problem when determining maximum word length in request text
[rocksndiamonds.git] / src / libgame / text.c
index eb755ba5f41fb55a9c079cbeb4b6dc23a536ef00..0974481a785548081f20af77278c0e45ffc3fb03 100644 (file)
@@ -101,10 +101,12 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y)
   int font_bitmap_id = gfx.select_font_function(font_nr);
   struct FontBitmapInfo *font = &gfx.font_bitmap_info[font_bitmap_id];
   int font_pos = getFontCharPosition(font_nr, c);
+  int offset_x = (font->offset_x != 0 ? font->offset_x : font->width);
+  int offset_y = (font->offset_y != 0 ? font->offset_y : font->height);
 
   *bitmap = font->bitmap;
-  *x = font->src_x + (font_pos % font->num_chars_per_line) * font->width;
-  *y = font->src_y + (font_pos / font->num_chars_per_line) * font->height;
+  *x = font->src_x + (font_pos % font->num_chars_per_line) * offset_x;
+  *y = font->src_y + (font_pos / font->num_chars_per_line) * offset_y;
 }
 
 
@@ -112,14 +114,16 @@ void getFontCharSource(int font_nr, char c, Bitmap **bitmap, int *x, int *y)
 /* text string helper functions                                              */
 /* ========================================================================= */
 
-int maxWordLengthInString(char *text)
+int maxWordLengthInRequestString(char *text)
 {
   char *text_ptr;
   int word_len = 0, max_word_len = 0;
 
   for (text_ptr = text; *text_ptr; text_ptr++)
   {
-    word_len = (*text_ptr != ' ' ? word_len + 1 : 0);
+    word_len = (*text_ptr != ' ' &&
+               *text_ptr != '?' &&
+               *text_ptr != '!' ? word_len + 1 : 0);
 
     max_word_len = MAX(word_len, max_word_len);
   }
@@ -457,18 +461,17 @@ static boolean getCheckedTokenValueFromString(char *string, char **token,
 
 static void DrawTextBuffer_Flush(int x, int y, char *buffer, int font_nr,
                                 int line_length, int cut_length,
-                                int line_spacing, int mask_mode,
-                                boolean centered, int current_line)
+                                int mask_mode, boolean centered,
+                                int current_ypos)
 {
   int buffer_len = strlen(buffer);
   int font_width = getFontWidth(font_nr);
-  int font_height = getFontHeight(font_nr);
   int offset_chars = (centered ? (line_length - buffer_len) / 2 : 0);
   int offset_xsize =
     (centered ? font_width * (line_length - buffer_len) / 2 : 0);
   int final_cut_length = MAX(0, cut_length - offset_chars);
   int xx = x + offset_xsize;
-  int yy = y + current_line * (font_height + line_spacing);
+  int yy = y + current_ypos;
 
   buffer[final_cut_length] = '\0';
 
@@ -485,7 +488,11 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
 {
   char buffer[line_length + 1];
   int buffer_len;
+  int font_height = getFontHeight(font_nr);
+  int line_height = font_height + line_spacing;
   int current_line = 0;
+  int current_ypos = 0;
+  int max_ysize = max_lines * line_height;
 
   if (text_buffer == NULL || *text_buffer == '\0')
     return 0;
@@ -499,7 +506,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
   buffer[0] = '\0';
   buffer_len = 0;
 
-  while (*text_buffer && current_line < max_lines)
+  while (*text_buffer && current_ypos < max_ysize)
   {
     char line[MAX_LINE_LEN + 1];
     char *line_ptr;
@@ -526,11 +533,11 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
       if (getCheckedTokenValueFromString(line + 1, &token, &value))
       {
        /* if found, flush the current buffer, if non-empty */
-       if (buffer_len > 0 && current_line < max_lines)
+       if (buffer_len > 0 && current_ypos < max_ysize)
        {
          DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length,
-                              line_spacing, mask_mode, centered, current_line);
-
+                              mask_mode, centered, current_ypos);
+         current_ypos += line_height;
          current_line++;
 
          buffer[0] = '\0';
@@ -545,6 +552,10 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
          centered = get_boolean_from_string(value);
        else if (strEqual(token, ".parse_comments"))
          parse_comments = get_boolean_from_string(value);
+
+       // if font has changed, depending values need to be updated as well
+       font_height = getFontHeight(font_nr);
+       line_height = font_height + line_spacing;
       }
 
       continue;
@@ -565,7 +576,7 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
 
     line_ptr = line;
 
-    while (*line_ptr && current_line < max_lines)
+    while (*line_ptr && current_ypos < max_ysize)
     {
       boolean buffer_filled;
 
@@ -596,7 +607,8 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
       if (buffer_filled)
       {
        DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length,
-                            line_spacing, mask_mode, centered, current_line);
+                            mask_mode, centered, current_ypos);
+       current_ypos += line_height;
        current_line++;
 
        last_line_was_empty = (buffer_len == 0);
@@ -607,10 +619,11 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
     }
   }
 
-  if (buffer_len > 0 && current_line < max_lines)
+  if (buffer_len > 0 && current_ypos < max_ysize)
   {
     DrawTextBuffer_Flush(x, y, buffer, font_nr, line_length, cut_length,
-                        line_spacing, mask_mode, centered, current_line);
+                        mask_mode, centered, current_ypos);
+    current_ypos += line_height;
     current_line++;
   }