rnd-20070315-1-src
authorHolger Schemel <info@artsoft.org>
Thu, 15 Mar 2007 00:37:40 +0000 (01:37 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:54:53 +0000 (10:54 +0200)
* added full configurability of "readme.txt" screen appearance:
  - readme.x:             <left position used with alignment>
  - readme.y:             <top position>
  - readme.width:         <maximim text width in pixels>
  - readme.height:        <maximum text height in pixels>
  - readme.chars:         <maximum number of chars per line>
  - readme.lines:         <maximum number of lines displayed>
  - readme.align:         left,center,right (default: center)
  - readme.font:          font name
  - readme.autowrap:      true,false (default: true)
  - readme.centered:      true,false (default: false)
  - readme.skip_comments: true,false (default: true)
  - readme.sort_priority: (currently not used)
  when "readme.chars" and/or "readme.lines" is set to "-1" (this is the
  default), they are automatically determined from "readme.width" and
  "readme.height" accordingly; when they are not "-1", they have
  precedence over "readme.width" and "readme.height"

14 files changed:
ChangeLog
src/conf_g2m.c
src/conf_g2s.c
src/conf_gfx.c
src/conf_mus.c
src/conf_mus.h
src/conf_snd.c
src/conf_snd.h
src/conftime.h
src/game.c
src/libgame/setup.c
src/libgame/system.h
src/libgame/text.c
src/screens.c

index 5a9ed2021c500716795cc6961e975e315fb4bc95..5b5d26561085ccc49d44c2676098f995b52dee7f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,34 @@
 2007-03-14
+       * added full configurability of "readme.txt" screen appearance:
+         - readme.x:             <left position used with alignment>
+         - readme.y:             <top position>
+         - readme.width:         <maximim text width in pixels>
+         - readme.height:        <maximum text height in pixels>
+         - readme.chars:         <maximum number of chars per line>
+         - readme.lines:         <maximum number of lines displayed>
+         - readme.align:         left,center,right (default: center)
+         - readme.font:          font name
+         - readme.autowrap:      true,false (default: true)
+         - readme.centered:      true,false (default: false)
+         - readme.skip_comments: true,false (default: true)
+         - readme.sort_priority: (currently not used)
+         when "readme.chars" and/or "readme.lines" is set to "-1" (this is the
+         default), they are automatically determined from "readme.width" and
+         "readme.height" accordingly; when they are not "-1", they have
+         precedence over "readme.width" and "readme.height"
        * added internal ad-hoc config settings for displaying text files like
          title messages or "readme.txt" style level set info files:
-         - .autowrap:      true,false (default: true)
-         - .centered:      true,false (default: false)
-         - .skip_comments: true,false (default: true)
-         (the leading '.' and the separating ':' are mandatory here)
+         - .autowrap:      true,false (default: value of readme.autowrap)
+         - .centered:      true,false (default: value of readme.autowrap)
+         - .skip_comments: true,false (default: value of readme.autowrap)
+         (the leading '.' and the separating ':' are mandatory here); to use
+         these ad-hoc settings, they have to be written inside a comment, like
+         "# .autowrap: false" or "# .centered: true"; these settings then
+         override the above global settings (they can even be used more than
+         once, like "# .centered: true", then some text that should be drawn
+         centered, then "# .centered: false" to go back to non-centered text;
+         only ".skip_comments" can not be used after a ".skip_comments: false"
+         again, as this generally disables detecting comments at all)
 
 2007-03-08
        * changed some numerical limits in the level editor from 255 to 999
index 447025c1b8d548efcdb6e0ebac6e0b72d6099032..f1ba07544a15d19a00e057f05a003c76e2664a3a 100644 (file)
@@ -62,6 +62,86 @@ gamemode_to_music[] =
     GFX_SPECIAL_ARG_SETUP,
     MUS_BACKGROUND_SETUP
   },
+  {
+    -1,
+    MUS_TITLESCREEN_INITIAL_1
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_INITIAL_2
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_INITIAL_3
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_INITIAL_4
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_INITIAL_5
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_1
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_2
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_3
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_4
+  },
+  {
+    -1,
+    MUS_TITLESCREEN_5
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_INITIAL_1
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_INITIAL_2
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_INITIAL_3
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_INITIAL_4
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_INITIAL_5
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_1
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_2
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_3
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_4
+  },
+  {
+    -1,
+    MUS_TITLEMESSAGE_5
+  },
   {
     -1,
     -1
index b4c9ff8f81375f32217f1c2d25d73d6a77041dcc..f38fe7fef3ea61ee08e02eec43c8e43feac1eb71 100644 (file)
@@ -58,6 +58,86 @@ gamemode_to_sound[] =
     GFX_SPECIAL_ARG_SETUP,
     SND_BACKGROUND_SETUP
   },
+  {
+    -1,
+    SND_TITLESCREEN_INITIAL_1
+  },
+  {
+    -1,
+    SND_TITLESCREEN_INITIAL_2
+  },
+  {
+    -1,
+    SND_TITLESCREEN_INITIAL_3
+  },
+  {
+    -1,
+    SND_TITLESCREEN_INITIAL_4
+  },
+  {
+    -1,
+    SND_TITLESCREEN_INITIAL_5
+  },
+  {
+    -1,
+    SND_TITLESCREEN_1
+  },
+  {
+    -1,
+    SND_TITLESCREEN_2
+  },
+  {
+    -1,
+    SND_TITLESCREEN_3
+  },
+  {
+    -1,
+    SND_TITLESCREEN_4
+  },
+  {
+    -1,
+    SND_TITLESCREEN_5
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_INITIAL_1
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_INITIAL_2
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_INITIAL_3
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_INITIAL_4
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_INITIAL_5
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_1
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_2
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_3
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_4
+  },
+  {
+    -1,
+    SND_TITLEMESSAGE_5
+  },
   {
     -1,
     -1
index f75a4671211f1da55c4179a6a4f93aad62159200..fc506b54e005ff513a72e3653fcdda2f0b5dcada 100644 (file)
@@ -5079,10 +5079,10 @@ struct ConfigInfo image_config[] =
   { "titlemessage_5.skip_comments",            "false"                 },
   { "titlemessage_5.sort_priority",            "0"                     },
 
-  { "readme.x",                                        "-1"                    },
-  { "readme.y",                                        "-1"                    },
-  { "readme.width",                            "-1"                    },
-  { "readme.height",                           "-1"                    },
+  { "readme.x",                                        "272"                   },
+  { "readme.y",                                        "150"                   },
+  { "readme.width",                            "480"                   },
+  { "readme.height",                           "364"                   },
   { "readme.chars",                            "-1"                    },
   { "readme.lines",                            "-1"                    },
   { "readme.align",                            "center"                },
index 2d2cd8a9473bedb7045476eb28c4f2d437173103..c47a5c885cab9befba6b89f755a337805fc1ce55 100644 (file)
@@ -38,6 +38,27 @@ struct ConfigInfo music_config[] =
   { "background.INFO",                 "rhythmloop.wav"                },
   { "background.SETUP",                        UNDEFINED_FILENAME              },
 
+  { "titlescreen_initial_1",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_2",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_3",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_4",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_5",           UNDEFINED_FILENAME              },
+  { "titlescreen_1",                   UNDEFINED_FILENAME              },
+  { "titlescreen_2",                   UNDEFINED_FILENAME              },
+  { "titlescreen_3",                   UNDEFINED_FILENAME              },
+  { "titlescreen_4",                   UNDEFINED_FILENAME              },
+  { "titlescreen_5",                   UNDEFINED_FILENAME              },
+  { "titlemessage_initial_1",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_2",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_3",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_4",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_5",          UNDEFINED_FILENAME              },
+  { "titlemessage_1",                  UNDEFINED_FILENAME              },
+  { "titlemessage_2",                  UNDEFINED_FILENAME              },
+  { "titlemessage_3",                  UNDEFINED_FILENAME              },
+  { "titlemessage_4",                  UNDEFINED_FILENAME              },
+  { "titlemessage_5",                  UNDEFINED_FILENAME              },
+
   /* there is no definition for "background.PLAYING", because this would
      prevent selecting music from music directory that is not defined in
      "musicinfo.conf", when no default music is defined here */
index 6c7f9352596cc7776e275cb5f8f5b3d4632b26ba..ec9246399fcb8f78fc5009e86ca86153a58466a6 100644 (file)
 #define MUS_BACKGROUND_EDITOR                          6
 #define MUS_BACKGROUND_INFO                            7
 #define MUS_BACKGROUND_SETUP                           8
+#define MUS_TITLESCREEN_INITIAL_1                      9
+#define MUS_TITLESCREEN_INITIAL_2                      10
+#define MUS_TITLESCREEN_INITIAL_3                      11
+#define MUS_TITLESCREEN_INITIAL_4                      12
+#define MUS_TITLESCREEN_INITIAL_5                      13
+#define MUS_TITLESCREEN_1                              14
+#define MUS_TITLESCREEN_2                              15
+#define MUS_TITLESCREEN_3                              16
+#define MUS_TITLESCREEN_4                              17
+#define MUS_TITLESCREEN_5                              18
+#define MUS_TITLEMESSAGE_INITIAL_1                     19
+#define MUS_TITLEMESSAGE_INITIAL_2                     20
+#define MUS_TITLEMESSAGE_INITIAL_3                     21
+#define MUS_TITLEMESSAGE_INITIAL_4                     22
+#define MUS_TITLEMESSAGE_INITIAL_5                     23
+#define MUS_TITLEMESSAGE_1                             24
+#define MUS_TITLEMESSAGE_2                             25
+#define MUS_TITLEMESSAGE_3                             26
+#define MUS_TITLEMESSAGE_4                             27
+#define MUS_TITLEMESSAGE_5                             28
 
-#define NUM_MUSIC_FILES                                        9
+#define NUM_MUSIC_FILES                                        29
 
 #endif /* CONF_MUS_H */
index 8f8d58dcabe779aa6ffee9efc629e624f2c512fb..b3761601c574e600259165d34789f240243bfdbe 100644 (file)
@@ -266,6 +266,27 @@ struct ConfigInfo sound_config[] =
   { "background.INFO",                 UNDEFINED_FILENAME              },
   { "background.SETUP",                        UNDEFINED_FILENAME              },
 
+  { "titlescreen_initial_1",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_2",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_3",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_4",           UNDEFINED_FILENAME              },
+  { "titlescreen_initial_5",           UNDEFINED_FILENAME              },
+  { "titlescreen_1",                   UNDEFINED_FILENAME              },
+  { "titlescreen_2",                   UNDEFINED_FILENAME              },
+  { "titlescreen_3",                   UNDEFINED_FILENAME              },
+  { "titlescreen_4",                   UNDEFINED_FILENAME              },
+  { "titlescreen_5",                   UNDEFINED_FILENAME              },
+  { "titlemessage_initial_1",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_2",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_3",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_4",          UNDEFINED_FILENAME              },
+  { "titlemessage_initial_5",          UNDEFINED_FILENAME              },
+  { "titlemessage_1",                  UNDEFINED_FILENAME              },
+  { "titlemessage_2",                  UNDEFINED_FILENAME              },
+  { "titlemessage_3",                  UNDEFINED_FILENAME              },
+  { "titlemessage_4",                  UNDEFINED_FILENAME              },
+  { "titlemessage_5",                  UNDEFINED_FILENAME              },
+
 #if 0
   { "[not used]",                      "antigrav.wav"                  },
   { "[not used]",                      "bong.wav"                      },
index 6691c8e0c32630519edbcb848f5189efd5cb3af5..860ac5ca9cf8f0e4bc5d084caacee3afddc61513 100644 (file)
 #define SND_BACKGROUND_EDITOR                          201
 #define SND_BACKGROUND_INFO                            202
 #define SND_BACKGROUND_SETUP                           203
+#define SND_TITLESCREEN_INITIAL_1                      204
+#define SND_TITLESCREEN_INITIAL_2                      205
+#define SND_TITLESCREEN_INITIAL_3                      206
+#define SND_TITLESCREEN_INITIAL_4                      207
+#define SND_TITLESCREEN_INITIAL_5                      208
+#define SND_TITLESCREEN_1                              209
+#define SND_TITLESCREEN_2                              210
+#define SND_TITLESCREEN_3                              211
+#define SND_TITLESCREEN_4                              212
+#define SND_TITLESCREEN_5                              213
+#define SND_TITLEMESSAGE_INITIAL_1                     214
+#define SND_TITLEMESSAGE_INITIAL_2                     215
+#define SND_TITLEMESSAGE_INITIAL_3                     216
+#define SND_TITLEMESSAGE_INITIAL_4                     217
+#define SND_TITLEMESSAGE_INITIAL_5                     218
+#define SND_TITLEMESSAGE_1                             219
+#define SND_TITLEMESSAGE_2                             220
+#define SND_TITLEMESSAGE_3                             221
+#define SND_TITLEMESSAGE_4                             222
+#define SND_TITLEMESSAGE_5                             223
 
-#define NUM_SOUND_FILES                                        204
+#define NUM_SOUND_FILES                                        224
 
 #endif /* CONF_SND_H */
index 335ff3a5c5513074a83a651b50b813c575e2cc48..248978e20e285c819891f5e3349733a47babaf40 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2007-03-14 00:32"
+#define COMPILE_DATE_STRING "2007-03-14 23:19"
index 297efe8502254ba09972f195dbea379219e08713..17981be5ad1d002cd3d615a05896e6b5dc109c00 100644 (file)
@@ -90,8 +90,8 @@
 #if 1
 #define PANEL_OFF()            (local_player->LevelSolved_PanelOff)
 #define        PANEL_DEACTIVATED(p)    ((p)->x < 0 || (p)->y < 0 || PANEL_OFF())
-#define PANEL_XPOS(p)          (DX + ALIGNED_MENU_XPOS(p))
-#define PANEL_YPOS(p)          (DY + ALIGNED_MENU_YPOS(p))
+#define PANEL_XPOS(p)          (DX + ALIGNED_TEXT_XPOS(p))
+#define PANEL_YPOS(p)          (DY + ALIGNED_TEXT_YPOS(p))
 #else
 #define        PANEL_DEACTIVATED(p)    ((p).x < 0 || (p).y < 0)
 #define PANEL_XPOS(p)          (ALIGNED_XPOS((p).x, (p).width, (p).align))
index 45a9895a9ef444b3b3f7638f543e1f743839df73..985c160a245b9f3b16f33ecedb2e9a79b4c99c9c 100644 (file)
@@ -1760,8 +1760,8 @@ boolean getTokenValueFromSetupLine(char *line, char **token, char **value)
 }
 
 #if 1
-static void loadSetupFileData(void *setup_file_data, char *filename,
-                             boolean top_recursion_level, boolean is_hash)
+static boolean loadSetupFileData(void *setup_file_data, char *filename,
+                                boolean top_recursion_level, boolean is_hash)
 {
   static SetupFileHash *include_filename_hash = NULL;
   char line[MAX_LINE_LEN], line_raw[MAX_LINE_LEN], previous_line[MAX_LINE_LEN];
@@ -1780,7 +1780,7 @@ static void loadSetupFileData(void *setup_file_data, char *filename,
   {
     Error(ERR_WARN, "cannot open configuration file '%s'", filename);
 
-    return;
+    return FALSE;
   }
 
   /* use "insert pointer" to store list end for constant insertion complexity */
@@ -1895,12 +1895,14 @@ static void loadSetupFileData(void *setup_file_data, char *filename,
 
   if (top_recursion_level)
     freeSetupFileHash(include_filename_hash);
+
+  return TRUE;
 }
 
 #else
 
-static void loadSetupFileData(void *setup_file_data, char *filename,
-                             boolean top_recursion_level, boolean is_hash)
+static boolean loadSetupFileData(void *setup_file_data, char *filename,
+                                boolean top_recursion_level, boolean is_hash)
 {
   static SetupFileHash *include_filename_hash = NULL;
   char line[MAX_LINE_LEN], line_raw[MAX_LINE_LEN], previous_line[MAX_LINE_LEN];
@@ -1919,7 +1921,7 @@ static void loadSetupFileData(void *setup_file_data, char *filename,
   {
     Error(ERR_WARN, "cannot open configuration file '%s'", filename);
 
-    return;
+    return FALSE;
   }
 
   /* use "insert pointer" to store list end for constant insertion complexity */
@@ -2125,6 +2127,8 @@ static void loadSetupFileData(void *setup_file_data, char *filename,
 
   if (top_recursion_level)
     freeSetupFileHash(include_filename_hash);
+
+  return TRUE;
 }
 #endif
 
@@ -2154,7 +2158,12 @@ SetupFileList *loadSetupFileList(char *filename)
   SetupFileList *setup_file_list = newSetupFileList("", "");
   SetupFileList *first_valid_list_entry;
 
-  loadSetupFileData(setup_file_list, filename, TRUE, FALSE);
+  if (!loadSetupFileData(setup_file_list, filename, TRUE, FALSE))
+  {
+    freeSetupFileList(setup_file_list);
+
+    return NULL;
+  }
 
   first_valid_list_entry = setup_file_list->next;
 
@@ -2169,7 +2178,12 @@ SetupFileHash *loadSetupFileHash(char *filename)
 {
   SetupFileHash *setup_file_hash = newSetupFileHash();
 
-  loadSetupFileData(setup_file_hash, filename, TRUE, TRUE);
+  if (!loadSetupFileData(setup_file_hash, filename, TRUE, TRUE))
+  {
+    freeSetupFileHash(setup_file_hash);
+
+    return NULL;
+  }
 
   return setup_file_hash;
 }
index 5825fc53d9ed022be42e05e4483429c740e4c5a8..6df8df049d31b2ddd092d2bf9885b6116031b572 100644 (file)
 
 #define ALIGNED_XPOS(x,w,a)    ((a) == ALIGN_CENTER ? (x) - (w) / 2 :  \
                                 (a) == ALIGN_RIGHT  ? (x) - (w) : (x))
-#define ALIGNED_MENU_XPOS(p)   ALIGNED_XPOS((p)->x, (p)->width, (p)->align)
-#define ALIGNED_MENU_YPOS(p)   ((p)->y)
+#define ALIGNED_TEXT_XPOS(p)   ALIGNED_XPOS((p)->x, (p)->width, (p)->align)
+#define ALIGNED_TEXT_YPOS(p)   ((p)->y)
 
 /* values for redraw_mask */
 #define REDRAW_NONE            (0)
index f781a56359f7bde43b887737dde568edf687bb9c..6446ffe21d9bf154ff00dc39351d647eeaf87148 100644 (file)
@@ -753,7 +753,11 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
     char line[MAX_LINE_LEN + 1];
     char *line_ptr;
     boolean last_line_was_empty = TRUE;
+#if 1
+    int num_line_chars = MAX_LINE_LEN;
+#else
     int num_line_chars = (autowrap ? MAX_LINE_LEN : line_length);
+#endif
     int i;
 
     /* copy next line from text buffer to line buffer (nearly fgets() style) */
@@ -830,7 +834,6 @@ int DrawTextBuffer(int x, int y, char *text_buffer, int font_nr,
        }
        else
        {
-         /* !!! CAN NEVER HAPPEN -- CHECK + CORRECT !!! */
          buffer_len = line_length;
          strncpy(buffer, line_ptr, line_length);
        }
index a5c9c003ff78d40f55e524825074ae7caeea4488..51a30367e49f618bb741edd3413f628119e1bbe0 100644 (file)
@@ -504,6 +504,8 @@ static int compareTitleControlInfo(const void *object1, const void *object2)
     compare_result = (tci1->initial ? -1 : +1);
   else if (tci1->sort_priority != tci2->sort_priority)
     compare_result = tci1->sort_priority - tci2->sort_priority;
+  else if (tci1->is_image != tci2->is_image)
+    compare_result = (tci1->is_image ? -1 : +1);
   else
     compare_result = tci1->local_nr - tci2->local_nr;
 
@@ -734,8 +736,8 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text,
       if (visibleTextPos(pos_text) && text != NULL)
       {
        struct TextPosInfo *pos = pos_text;
-       int x = mSX + ALIGNED_MENU_XPOS(pos);
-       int y = mSY + ALIGNED_MENU_YPOS(pos);
+       int x = mSX + ALIGNED_TEXT_XPOS(pos);
+       int y = mSY + ALIGNED_TEXT_YPOS(pos);
 
 #if 1
        /* (check why/if this is needed) */
@@ -747,8 +749,8 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text,
       if (visibleTextPos(pos_input) && input != NULL)
       {
        struct TextPosInfo *pos = pos_input;
-       int x = mSX + ALIGNED_MENU_XPOS(pos);
-       int y = mSY + ALIGNED_MENU_YPOS(pos);
+       int x = mSX + ALIGNED_TEXT_XPOS(pos);
+       int y = mSY + ALIGNED_TEXT_YPOS(pos);
 
 #if 1
        /* (check why/if this is needed) */
@@ -788,8 +790,8 @@ static boolean insideMenuPosRect(struct MenuPosInfo *rect, int x, int y)
   if (rect == NULL)
     return FALSE;
 
-  int rect_x = ALIGNED_MENU_XPOS(rect);
-  int rect_y = ALIGNED_MENU_YPOS(rect);
+  int rect_x = ALIGNED_TEXT_XPOS(rect);
+  int rect_y = ALIGNED_TEXT_YPOS(rect);
 
   return (x >= rect_x && x < rect_x + rect->width &&
          y >= rect_y && y < rect_y + rect->height);
@@ -800,8 +802,8 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y)
   if (rect == NULL)
     return FALSE;
 
-  int rect_x = ALIGNED_MENU_XPOS(rect);
-  int rect_y = ALIGNED_MENU_YPOS(rect);
+  int rect_x = ALIGNED_TEXT_XPOS(rect);
+  int rect_y = ALIGNED_TEXT_YPOS(rect);
 
   return (x >= rect_x && x < rect_x + rect->width &&
          y >= rect_y && y < rect_y + rect->height);
@@ -956,6 +958,7 @@ void DrawTitleScreenImage(int nr, boolean initial)
 void DrawTitleScreenMessage(int nr, boolean initial)
 {
   char *filename = getLevelSetTitleMessageFilename(nr, initial);
+  struct TitleMessageInfo *tmi = getTitleMessageInfo(nr, initial);
   int font_nr = FONT_TEXT_1;
   int font_width;
   int font_height;
@@ -984,7 +987,8 @@ void DrawTitleScreenMessage(int nr, boolean initial)
   max_lines_per_screen = (WIN_YSIZE - pad_y) / font_height - 1;
 
   DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
-              max_lines_per_screen, -1, FALSE, FALSE, FALSE);
+              max_lines_per_screen, -1, tmi->autowrap, tmi->centered,
+              tmi->skip_comments);
 
   game_status = last_game_status;      /* restore current game status */
 }
@@ -3091,23 +3095,66 @@ void HandleInfoScreen_Version(int button)
 
 void DrawInfoScreen_LevelSet()
 {
+  struct TitleMessageInfo *tmi = &readme;
   int ystart1 = mSY - SY + 100;
   int ystart2 = mSY - SY + 150;
   int ybottom = mSY - SY + SYSIZE - 20;
   char *filename = getLevelSetInfoFilename();
 #if 1
+#if 1
+  int font_nr = tmi->font;
+#else
   int font_nr = FONT_INFO_LEVELSET;
+#endif
 #else
   int font_nr = FONT_LEVEL_NUMBER;
 #endif
+#if 0
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
+#endif
+#if 1
+#if 0
+  int sx = mSX + ALIGNED_TEXT_XPOS(tmi);
+  int sy = mSY + ALIGNED_TEXT_YPOS(tmi);
+#endif
+#if 0
+  int width  = tmi->width;
+  int height = tmi->height;
+#endif
+#else
   int pad_x = 32;
   int pad_y = 150;
   int sx = mSX + pad_x;
   int sy = mSY + 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 width = SXSIZE - 2 * pad_x;
+  int height = SYSIZE - pad_y;
+#endif
+#if 1
+#if 0
+  int max_chars = tmi->chars;
+  int max_lines = tmi->lines;
+#endif
+#else
+  int max_chars_per_line = width / font_width;
+#if 1
+  int max_lines_per_screen = height / font_height;
+#else
+  int max_lines_per_screen = height / font_height - 1; /* minus footer line */
+#endif
+#endif
+
+  /* if chars set to "-1", automatically determine by text and font width */
+  if (tmi->chars == -1)
+    tmi->chars = tmi->width / getFontWidth(font_nr);
+  else
+    tmi->width = tmi->chars * getFontWidth(font_nr);
+
+  /* if lines set to "-1", automatically determine by text and font height */
+  if (tmi->lines == -1)
+    tmi->lines = tmi->height / getFontHeight(font_nr);
+  else
+    tmi->height = tmi->lines * getFontHeight(font_nr);
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
 
@@ -3122,8 +3169,9 @@ void DrawInfoScreen_LevelSet()
                    "Press any key or button for info menu");
 
   if (filename != NULL)
-    DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
-                max_lines_per_screen, -1, TRUE, FALSE, TRUE);
+    DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi),
+                filename, font_nr, tmi->chars, -1, tmi->lines, -1,
+                tmi->autowrap, tmi->centered, tmi->skip_comments);
   else
     DrawTextSCentered(ystart2, FONT_TEXT_2,
                      "No information for this level set.");
@@ -3231,8 +3279,8 @@ void HandleTypeName(int newxpos, Key key)
   struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
 #if 1
   struct TextPosInfo *pos = mci->pos_input;
-  int startx = mSX + ALIGNED_MENU_XPOS(pos);
-  int starty = mSY + ALIGNED_MENU_YPOS(pos);
+  int startx = mSX + ALIGNED_TEXT_XPOS(pos);
+  int starty = mSY + ALIGNED_TEXT_YPOS(pos);
 #endif
 #if 1
   static int xpos = 0;
@@ -3267,7 +3315,7 @@ void HandleTypeName(int newxpos, Key key)
 #if 0
     /* add one character width for added cursor character */
     pos->width += font_width;
-    startx = mSX + ALIGNED_MENU_XPOS(pos);
+    startx = mSX + ALIGNED_TEXT_XPOS(pos);
 
     DrawText(startx, starty, setup.player_name, font_active_nr);
     DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
@@ -3283,7 +3331,7 @@ void HandleTypeName(int newxpos, Key key)
 #if 0
     /* add one character width for added name text character */
     pos->width += font_width;
-    startx = mSX + ALIGNED_MENU_XPOS(pos);
+    startx = mSX + ALIGNED_TEXT_XPOS(pos);
 
     DrawText(startx, starty, setup.player_name, font_active_nr);
     DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
@@ -3298,7 +3346,7 @@ void HandleTypeName(int newxpos, Key key)
 #if 0
     /* remove one character width for removed name text character */
     pos->width -= font_width;
-    startx = mSX + ALIGNED_MENU_XPOS(pos);
+    startx = mSX + ALIGNED_TEXT_XPOS(pos);
 
     DrawText(startx, starty, setup.player_name, font_active_nr);
     DrawText(startx + xpos * font_width, starty, "_ ", font_active_nr);
@@ -3309,7 +3357,7 @@ void HandleTypeName(int newxpos, Key key)
 #if 0
     /* remove one character width for removed cursor text character */
     pos->width -= font_width;
-    startx = mSX + ALIGNED_MENU_XPOS(pos);
+    startx = mSX + ALIGNED_TEXT_XPOS(pos);
 
     DrawText(startx, starty, setup.player_name, font_nr);
     DrawText(startx + xpos * font_width, starty, " ", font_active_nr);
@@ -3333,7 +3381,7 @@ void HandleTypeName(int newxpos, Key key)
   if (is_active)
   {
     pos->width = (strlen(setup.player_name) + 1) * font_width;
-    startx = mSX + ALIGNED_MENU_XPOS(pos);
+    startx = mSX + ALIGNED_TEXT_XPOS(pos);
 
     DrawText(startx, starty, setup.player_name, font_active_nr);
     DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
@@ -3341,7 +3389,7 @@ void HandleTypeName(int newxpos, Key key)
   else
   {
     pos->width = strlen(setup.player_name) * font_width;
-    startx = mSX + ALIGNED_MENU_XPOS(pos);
+    startx = mSX + ALIGNED_TEXT_XPOS(pos);
 
     DrawText(startx, starty, setup.player_name, font_nr);
   }