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
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
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
{ "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" },
{ "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 */
#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 */
{ "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" },
#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 */
-#define COMPILE_DATE_STRING "2007-03-14 00:32"
+#define COMPILE_DATE_STRING "2007-03-14 23:19"
#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))
}
#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];
{
Error(ERR_WARN, "cannot open configuration file '%s'", filename);
- return;
+ return FALSE;
}
/* use "insert pointer" to store list end for constant insertion complexity */
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];
{
Error(ERR_WARN, "cannot open configuration file '%s'", filename);
- return;
+ return FALSE;
}
/* use "insert pointer" to store list end for constant insertion complexity */
if (top_recursion_level)
freeSetupFileHash(include_filename_hash);
+
+ return TRUE;
}
#endif
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;
{
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;
}
#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)
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) */
}
else
{
- /* !!! CAN NEVER HAPPEN -- CHECK + CORRECT !!! */
buffer_len = line_length;
strncpy(buffer, line_ptr, line_length);
}
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;
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) */
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) */
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);
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);
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;
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 */
}
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);
"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.");
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;
#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);
#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);
#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);
#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);
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);
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);
}