/* screens in the setup menu */
#define SETUP_MODE_MAIN 0
#define SETUP_MODE_GAME 1
-#define SETUP_MODE_EDITOR 2
-#define SETUP_MODE_INPUT 3
-#define SETUP_MODE_SHORTCUT_1 4
-#define SETUP_MODE_SHORTCUT_2 5
-#define SETUP_MODE_GRAPHICS 6
-#define SETUP_MODE_CHOOSE_SCREEN_MODE 7
-#define SETUP_MODE_SOUND 8
-#define SETUP_MODE_ARTWORK 9
-#define SETUP_MODE_CHOOSE_GRAPHICS 10
-#define SETUP_MODE_CHOOSE_SOUNDS 11
-#define SETUP_MODE_CHOOSE_MUSIC 12
-
-#define MAX_SETUP_MODES 13
+#define SETUP_MODE_CHOOSE_GAME_SPEED 2
+#define SETUP_MODE_EDITOR 3
+#define SETUP_MODE_INPUT 4
+#define SETUP_MODE_SHORTCUT_1 5
+#define SETUP_MODE_SHORTCUT_2 6
+#define SETUP_MODE_GRAPHICS 7
+#define SETUP_MODE_CHOOSE_SCREEN_MODE 8
+#define SETUP_MODE_SOUND 9
+#define SETUP_MODE_ARTWORK 10
+#define SETUP_MODE_CHOOSE_GRAPHICS 11
+#define SETUP_MODE_CHOOSE_SOUNDS 12
+#define SETUP_MODE_CHOOSE_MUSIC 13
+
+#define MAX_SETUP_MODES 14
/* for input setup functions */
#define SETUPINPUT_SCREEN_POS_START 0
static void HandleSetupScreen_Input(int, int, int, int, int);
static void CustomizeKeyboard(int);
static void CalibrateJoystick(int);
+static void execSetupGame(void);
static void execSetupGraphics(void);
static void execSetupArtwork(void);
static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
-static boolean show_titlescreen_initial = TRUE;
-
static int setup_mode = SETUP_MODE_MAIN;
static int info_mode = INFO_MODE_MAIN;
static TreeInfo *screen_modes = NULL;
static TreeInfo *screen_mode_current = NULL;
+static TreeInfo *game_speeds = NULL;
+static TreeInfo *game_speed_current = NULL;
+
+static struct
+{
+ int value;
+ char *text;
+} game_speeds_list[] =
+{
+#if 1
+ { 30, "Very Slow" },
+ { 25, "Slow" },
+ { 20, "Normal" },
+ { 15, "Fast" },
+ { 10, "Very Fast" },
+#else
+ { 1000, "1/1s (Extremely Slow)" },
+ { 500, "1/2s" },
+ { 200, "1/5s" },
+ { 100, "1/10s" },
+ { 50, "1/20s" },
+ { 29, "1/35s (Original Supaplex)" },
+ { 25, "1/40s" },
+ { 20, "1/50s (Normal Speed)" },
+ { 14, "1/70s (Maximum Supaplex)" },
+ { 10, "1/100s" },
+ { 5, "1/200s" },
+ { 2, "1/500s" },
+ { 1, "1/1000s (Extremely Fast)" },
+#endif
+
+ { -1, NULL },
+};
+
#define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \
(s) <= GAME_MODE_SETUP ? (s) : \
(s) == GAME_MODE_PSEUDO_TYPENAME ? \
#endif
-#define MAIN_CONTROL_NAME 0
-#define MAIN_CONTROL_LEVELS 1
-#define MAIN_CONTROL_SCORES 2
-#define MAIN_CONTROL_EDITOR 3
-#define MAIN_CONTROL_INFO 4
-#define MAIN_CONTROL_GAME 5
-#define MAIN_CONTROL_SETUP 6
-#define MAIN_CONTROL_QUIT 7
-#define MAIN_CONTROL_PREV_LEVEL 8
-#define MAIN_CONTROL_NEXT_LEVEL 9
-#define MAIN_CONTROL_CURRENT_LEVEL 10
-#define MAIN_CONTROL_FIRST_LEVEL 11
-#define MAIN_CONTROL_LAST_LEVEL 12
-#define MAIN_CONTROL_LEVEL_INFO_1 13
-#define MAIN_CONTROL_LEVEL_INFO_2 14
-#define MAIN_CONTROL_TITLE_1 15
-#define MAIN_CONTROL_TITLE_2 16
-#define MAIN_CONTROL_TITLE_3 17
-
-static char main_text_name[10];
-static char main_text_current_level[10];
-static char main_text_first_level[10];
-static char main_text_last_level[10];
-static char main_input_name[MAX_PLAYER_NAME_LEN + 1];
+/* title display and control definitions */
+
+#define MAX_NUM_TITLE_SCREENS (2 * MAX_NUM_TITLE_IMAGES + \
+ 2 * MAX_NUM_TITLE_MESSAGES)
+
+static int num_title_screens = 0;
+
+struct TitleControlInfo
+{
+ boolean is_image;
+ boolean initial;
+ int local_nr;
+ int sort_priority;
+};
+
+struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS];
+
+
+/* main menu display and control definitions */
+
+#define MAIN_CONTROL_NAME 0
+#define MAIN_CONTROL_LEVELS 1
+#define MAIN_CONTROL_SCORES 2
+#define MAIN_CONTROL_EDITOR 3
+#define MAIN_CONTROL_INFO 4
+#define MAIN_CONTROL_GAME 5
+#define MAIN_CONTROL_SETUP 6
+#define MAIN_CONTROL_QUIT 7
+#define MAIN_CONTROL_PREV_LEVEL 8
+#define MAIN_CONTROL_NEXT_LEVEL 9
+#define MAIN_CONTROL_FIRST_LEVEL 10
+#define MAIN_CONTROL_LAST_LEVEL 11
+#define MAIN_CONTROL_LEVEL_NUMBER 12
+#define MAIN_CONTROL_LEVEL_INFO_1 13
+#define MAIN_CONTROL_LEVEL_INFO_2 14
+#define MAIN_CONTROL_LEVEL_NAME 15
+#define MAIN_CONTROL_LEVEL_AUTHOR 16
+#define MAIN_CONTROL_LEVEL_YEAR 17
+#define MAIN_CONTROL_LEVEL_IMPORTED_FROM 18
+#define MAIN_CONTROL_LEVEL_IMPORTED_BY 19
+#define MAIN_CONTROL_LEVEL_TESTED_BY 20
+#define MAIN_CONTROL_TITLE_1 21
+#define MAIN_CONTROL_TITLE_2 22
+#define MAIN_CONTROL_TITLE_3 23
+
+static char str_main_text_name[10];
+static char str_main_text_first_level[10];
+static char str_main_text_last_level[10];
+static char str_main_text_level_number[10];
+
+static char *main_text_name = str_main_text_name;
+static char *main_text_first_level = str_main_text_first_level;
+static char *main_text_last_level = str_main_text_last_level;
+static char *main_text_level_number = str_main_text_level_number;
+static char *main_text_levels = "Levelset";
+static char *main_text_scores = "Hall Of Fame";
+static char *main_text_editor = "Level Creator";
+static char *main_text_info = "Info Screen";
+static char *main_text_game = "Start Game";
+static char *main_text_setup = "Setup";
+static char *main_text_quit = "Quit";
+static char *main_text_level_name = level.name;
+static char *main_text_level_author = level.author;
+static char *main_text_level_year = NULL;
+static char *main_text_level_imported_from = NULL;
+static char *main_text_level_imported_by = NULL;
+static char *main_text_level_tested_by = NULL;
+static char *main_text_title_1 = PROGRAM_TITLE_STRING;
+static char *main_text_title_2 = PROGRAM_COPYRIGHT_STRING;
+static char *main_text_title_3 = PROGRAM_GAME_BY_STRING;
struct MainControlInfo
{
int button_graphic;
struct TextPosInfo *pos_text;
- char *text;
- int font_text;
+ char **text;
- struct MenuPosInfo *pos_input;
- char *input;
- int font_input;
+ struct TextPosInfo *pos_input;
+ char **input;
};
static struct MainControlInfo main_controls[] =
{
MAIN_CONTROL_NAME,
&menu.main.button.name, IMG_MENU_BUTTON,
- &menu.main.text.name, main_text_name, FONT_MENU_1,
- &menu.main.input.name, main_input_name, FONT_INPUT_1,
+ &menu.main.text.name, &main_text_name,
+ &menu.main.input.name, &setup.player_name,
},
{
MAIN_CONTROL_LEVELS,
&menu.main.button.levels, IMG_MENU_BUTTON_ENTER_MENU,
- &menu.main.text.levels, "Levelset", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.levels, &main_text_levels,
+ NULL, NULL,
},
{
MAIN_CONTROL_SCORES,
&menu.main.button.scores, IMG_MENU_BUTTON,
- &menu.main.text.scores, "Hall Of Fame", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.scores, &main_text_scores,
+ NULL, NULL,
},
{
MAIN_CONTROL_EDITOR,
&menu.main.button.editor, IMG_MENU_BUTTON,
- &menu.main.text.editor, "Level Creator", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.editor, &main_text_editor,
+ NULL, NULL,
},
{
MAIN_CONTROL_INFO,
&menu.main.button.info, IMG_MENU_BUTTON_ENTER_MENU,
- &menu.main.text.info, "Info Screen", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.info, &main_text_info,
+ NULL, NULL,
},
{
MAIN_CONTROL_GAME,
&menu.main.button.game, IMG_MENU_BUTTON,
- &menu.main.text.game, "Start Game", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.game, &main_text_game,
+ NULL, NULL,
},
{
MAIN_CONTROL_SETUP,
&menu.main.button.setup, IMG_MENU_BUTTON_ENTER_MENU,
- &menu.main.text.setup, "Setup", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.setup, &main_text_setup,
+ NULL, NULL,
},
{
MAIN_CONTROL_QUIT,
&menu.main.button.quit, IMG_MENU_BUTTON,
- &menu.main.text.quit, "Quit", FONT_MENU_1,
- NULL, NULL, -1,
+ &menu.main.text.quit, &main_text_quit,
+ NULL, NULL,
},
#if 0
/* (these two buttons are real gadgets) */
{
MAIN_CONTROL_PREV_LEVEL,
&menu.main.button.prev_level, IMG_MENU_BUTTON_PREV_LEVEL,
- NULL, NULL, -1,
- NULL, NULL, -1,
+ NULL, NULL,
+ NULL, NULL,
},
{
MAIN_CONTROL_NEXT_LEVEL,
&menu.main.button.next_level, IMG_MENU_BUTTON_NEXT_LEVEL,
- NULL, NULL, -1,
- NULL, NULL, -1,
+ NULL, NULL,
+ NULL, NULL,
},
#endif
{
- MAIN_CONTROL_CURRENT_LEVEL,
+ MAIN_CONTROL_FIRST_LEVEL,
NULL, -1,
- &menu.main.text.current_level, main_text_current_level,FONT_VALUE_1,
- NULL, NULL, -1,
+ &menu.main.text.first_level, &main_text_first_level,
+ NULL, NULL,
},
{
- MAIN_CONTROL_FIRST_LEVEL,
+ MAIN_CONTROL_LAST_LEVEL,
NULL, -1,
- &menu.main.text.first_level, main_text_first_level, FONT_TEXT_3,
- NULL, NULL, -1,
+ &menu.main.text.last_level, &main_text_last_level,
+ NULL, NULL,
},
{
- MAIN_CONTROL_LAST_LEVEL,
+ MAIN_CONTROL_LEVEL_NUMBER,
NULL, -1,
- &menu.main.text.last_level, main_text_last_level, FONT_TEXT_3,
- NULL, NULL, -1,
+ &menu.main.text.level_number, &main_text_level_number,
+ NULL, NULL,
},
{
MAIN_CONTROL_LEVEL_INFO_1,
NULL, -1,
- &menu.main.text.level_info_1, NULL, -1,
- NULL, NULL, -1,
+ &menu.main.text.level_info_1, NULL,
+ NULL, NULL,
},
{
MAIN_CONTROL_LEVEL_INFO_2,
NULL, -1,
- &menu.main.text.level_info_2, NULL, -1,
- NULL, NULL, -1,
+ &menu.main.text.level_info_2, NULL,
+ NULL, NULL,
+ },
+ {
+ MAIN_CONTROL_LEVEL_NAME,
+ NULL, -1,
+ &menu.main.text.level_name, &main_text_level_name,
+ NULL, NULL,
+ },
+ {
+ MAIN_CONTROL_LEVEL_AUTHOR,
+ NULL, -1,
+ &menu.main.text.level_author, &main_text_level_author,
+ NULL, NULL,
+ },
+ {
+ MAIN_CONTROL_LEVEL_YEAR,
+ NULL, -1,
+ &menu.main.text.level_year, &main_text_level_year,
+ NULL, NULL,
+ },
+ {
+ MAIN_CONTROL_LEVEL_IMPORTED_FROM,
+ NULL, -1,
+ &menu.main.text.level_imported_from, &main_text_level_imported_from,
+ NULL, NULL,
+ },
+ {
+ MAIN_CONTROL_LEVEL_IMPORTED_BY,
+ NULL, -1,
+ &menu.main.text.level_imported_by, &main_text_level_imported_by,
+ NULL, NULL,
+ },
+ {
+ MAIN_CONTROL_LEVEL_TESTED_BY,
+ NULL, -1,
+ &menu.main.text.level_tested_by, &main_text_level_tested_by,
+ NULL, NULL,
},
{
MAIN_CONTROL_TITLE_1,
NULL, -1,
- &menu.main.text.title_1, PROGRAM_TITLE_STRING, FONT_TITLE_1,
- NULL, NULL, -1,
+ &menu.main.text.title_1, &main_text_title_1,
+ NULL, NULL,
},
{
MAIN_CONTROL_TITLE_2,
NULL, -1,
- &menu.main.text.title_2, PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2,
- NULL, NULL, -1,
+ &menu.main.text.title_2, &main_text_title_2,
+ NULL, NULL,
},
{
MAIN_CONTROL_TITLE_3,
NULL, -1,
- &menu.main.text.title_3, PROGRAM_GAME_BY_STRING, FONT_TITLE_2,
- NULL, NULL, -1,
+ &menu.main.text.title_3, &main_text_title_3,
+ NULL, NULL,
},
{
-1,
NULL, -1,
- NULL, NULL, -1,
- NULL, NULL, -1,
+ NULL, NULL,
+ NULL, NULL,
}
};
+static int getTitleScreenGraphic(int nr, boolean initial)
+{
+ return (initial ? IMG_TITLESCREEN_INITIAL_1 : IMG_TITLESCREEN_1) + nr;
+}
+
+static struct TitleMessageInfo *getTitleMessageInfo(int nr, boolean initial)
+{
+ return (initial ? &titlemessage_initial[nr] : &titlemessage[nr]);
+}
+
+static int compareTitleControlInfo(const void *object1, const void *object2)
+{
+ const struct TitleControlInfo *tci1 = (struct TitleControlInfo *)object1;
+ const struct TitleControlInfo *tci2 = (struct TitleControlInfo *)object2;
+ int compare_result;
+
+ if (tci1->initial != tci2->initial)
+ 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;
+
+ return compare_result;
+}
+
+static void InitializeTitleControlsExt_AddTitleInfo(boolean is_image,
+ boolean initial,
+ int nr, int sort_priority)
+{
+ title_controls[num_title_screens].is_image = is_image;
+ title_controls[num_title_screens].initial = initial;
+ title_controls[num_title_screens].local_nr = nr;
+ title_controls[num_title_screens].sort_priority = sort_priority;
+
+ num_title_screens++;
+}
+
+static void InitializeTitleControls_CheckTitleInfo(boolean initial)
+{
+ int i;
+
+ for (i = 0; i < MAX_NUM_TITLE_IMAGES; i++)
+ {
+ int graphic = getTitleScreenGraphic(i, initial);
+ Bitmap *bitmap = graphic_info[graphic].bitmap;
+ int sort_priority = graphic_info[graphic].sort_priority;
+
+ if (bitmap != NULL)
+ InitializeTitleControlsExt_AddTitleInfo(TRUE, initial, i, sort_priority);
+ }
+
+ for (i = 0; i < MAX_NUM_TITLE_MESSAGES; i++)
+ {
+ struct TitleMessageInfo *tmi = getTitleMessageInfo(i, initial);
+ char *filename = getLevelSetTitleMessageFilename(i, initial);
+ int sort_priority = tmi->sort_priority;
+
+ if (filename != NULL)
+ InitializeTitleControlsExt_AddTitleInfo(FALSE, initial, i, sort_priority);
+ }
+}
+
+static void InitializeTitleControls(boolean show_title_initial)
+{
+ num_title_screens = 0;
+
+ if (show_title_initial)
+ InitializeTitleControls_CheckTitleInfo(TRUE);
+
+ InitializeTitleControls_CheckTitleInfo(FALSE);
+
+ /* sort title screens according to sort_priority and title number */
+ qsort(title_controls, num_title_screens, sizeof(struct TitleControlInfo),
+ compareTitleControlInfo);
+}
+
+static boolean visibleMenuPos(struct MenuPosInfo *pos)
+{
+ return (pos != NULL && pos->x != -1 && pos->y != -1);
+}
+
+static boolean visibleTextPos(struct TextPosInfo *pos)
+{
+ return (pos != NULL && pos->x != -1 && pos->y != -1);
+}
+
static void InitializeMainControls()
{
boolean local_team_mode = (!options.network && setup.team_mode);
int i;
/* set main control text values to dynamically determined values */
- sprintf(main_text_name, "%s", local_team_mode ? "Team:" : "Name:");
- sprintf(main_text_current_level, "%s", int2str(level_nr, 3));
- sprintf(main_text_first_level, "%03d", leveldir_current->first_level);
- sprintf(main_text_last_level, "%03d", leveldir_current->last_level);
- sprintf(main_input_name, "%s", setup.player_name);
+ sprintf(main_text_name, "%s", local_team_mode ? "Team:" : "Name:");
+ sprintf(main_text_first_level, "%03d", leveldir_current->first_level);
+ sprintf(main_text_last_level, "%03d", leveldir_current->last_level);
+ sprintf(main_text_level_number, "%s", int2str(level_nr, 3));
+
+ main_text_level_year = leveldir_current->year;
+ main_text_level_imported_from = leveldir_current->imported_from;
+ main_text_level_imported_by = leveldir_current->imported_by;
+ main_text_level_tested_by = leveldir_current->tested_by;
/* set main control screen positions to dynamically determined values */
for (i = 0; main_controls[i].nr != -1; i++)
int nr = mci->nr;
struct MenuPosInfo *pos_button = mci->pos_button;
struct TextPosInfo *pos_text = mci->pos_text;
- struct MenuPosInfo *pos_input = mci->pos_input;
- char *text = mci->text;
- char *input = mci->input;
+ struct TextPosInfo *pos_input = mci->pos_input;
+ char *text = (mci->text ? *mci->text : NULL);
+ char *input = (mci->input ? *mci->input : NULL);
int button_graphic = mci->button_graphic;
+#if 1
+ int font_text = (pos_text ? pos_text->font : -1);
+ int font_input = (pos_input ? pos_input->font : -1);
+#else
int font_text = mci->font_text;
int font_input = mci->font_input;
+#endif
int font_text_width = (font_text != -1 ? getFontWidth(font_text) : 0);
int font_text_height = (font_text != -1 ? getFontHeight(font_text) : 0);
#endif
}
- if (pos_button != NULL)
+ if (pos_button != NULL) /* (x/y may be -1/-1 here) */
{
if (pos_button->width == 0)
pos_button->width = button_width;
pos_button->height = button_height;
}
- if (pos_text != NULL)
+ if (pos_text != NULL) /* (x/y may be -1/-1 here) */
{
/* calculate width for non-clickable text -- needed for text alignment */
boolean calculate_text_width = (pos_button == NULL && text != NULL);
- if (pos_text->x == -1 && pos_button != NULL)
- pos_text->x = pos_button->x + pos_button->width;
- if (pos_text->y == -1 && pos_button != NULL)
- pos_text->y = pos_button->y;
+ if (visibleMenuPos(pos_button))
+ {
+ if (pos_text->x == -1)
+ pos_text->x = pos_button->x + pos_button->width;
+ if (pos_text->y == -1)
+ pos_text->y = pos_button->y;
+ }
if (pos_text->width == -1 || calculate_text_width)
pos_text->width = text_width;
pos_text->height = text_height;
}
- if (pos_input != NULL)
+ if (pos_input != NULL) /* (x/y may be -1/-1 here) */
{
- if (pos_input->x == -1 && pos_text != NULL)
- pos_input->x = pos_text->x + pos_text->width;
- if (pos_input->y == -1 && pos_text != NULL)
- pos_input->y = pos_text->y;
+ if (visibleTextPos(pos_text))
+ {
+ if (pos_input->x == -1)
+ pos_input->x = pos_text->x + pos_text->width;
+ if (pos_input->y == -1)
+ pos_input->y = pos_text->y;
+ }
if (pos_input->width == -1)
pos_input->width = input_width;
{
struct MenuPosInfo *pos_button = mci->pos_button;
struct TextPosInfo *pos_text = mci->pos_text;
- struct MenuPosInfo *pos_input = mci->pos_input;
- char *text = mci->text;
- char *input = mci->input;
+ struct TextPosInfo *pos_input = mci->pos_input;
+ char *text = (mci->text ? *mci->text : NULL);
+ char *input = (mci->input ? *mci->input : NULL);
int button_graphic = mci->button_graphic;
+#if 1
+ int font_text = (pos_text ? pos_text->font : -1);
+ int font_input = (pos_input ? pos_input->font : -1);
+#else
int font_text = mci->font_text;
int font_input = mci->font_input;
+#endif
if (active_text)
{
font_input = FONT_ACTIVE(font_input);
}
- if (pos_button != NULL)
+ if (visibleMenuPos(pos_button))
{
struct MenuPosInfo *pos = pos_button;
int x = mSX + pos->x;
DrawGraphicThruMaskExt(drawto, x, y, button_graphic, 0);
}
- if (pos_text != NULL && text != NULL)
+ 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) */
DrawBackgroundForFont(x, y, pos->width, pos->height, font_text);
+#endif
DrawText(x, y, text, font_text);
}
- if (pos_input != NULL && input != NULL)
+ if (visibleTextPos(pos_input) && input != NULL)
{
- struct MenuPosInfo *pos = pos_input;
- int x = mSX + ALIGNED_MENU_XPOS(pos);
- int y = mSY + ALIGNED_MENU_YPOS(pos);
+ struct TextPosInfo *pos = pos_input;
+ int x = mSX + ALIGNED_TEXT_XPOS(pos);
+ int y = mSY + ALIGNED_TEXT_YPOS(pos);
+#if 1
+ /* (check why/if this is needed) */
DrawBackgroundForFont(x, y, pos->width, pos->height, font_input);
+#endif
DrawText(x, y, input, font_input);
}
}
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);
}
#endif
-static int getTitleScreenGraphic()
-{
- return (show_titlescreen_initial ? IMG_TITLESCREEN_INITIAL_1 :
- IMG_TITLESCREEN_1);
-}
-
int effectiveGameStatus()
{
if (game_status == GAME_MODE_INFO && info_mode == INFO_MODE_TITLE)
return game_status;
}
-void DrawTitleScreenImage(int nr)
+void DrawTitleScreenImage(int nr, boolean initial)
{
- int graphic = getTitleScreenGraphic() + nr;
+ int graphic = getTitleScreenGraphic(nr, initial);
Bitmap *bitmap = graphic_info[graphic].bitmap;
#if 1
int width = graphic_info[graphic].width;
dst_x = (WIN_XSIZE - width) / 2;
dst_y = (WIN_YSIZE - height) / 2;
+ SetDrawBackgroundMask(REDRAW_ALL);
+ SetWindowBackgroundImage(IMG_BACKGROUND_TITLE);
+
ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
if (DrawingOnBackground(dst_x, dst_y))
title.auto_delay_final = graphic_info[graphic].auto_delay;
}
-void DrawTitleScreenMessage(char *filename)
+void DrawTitleScreenMessage(int nr, boolean initial)
{
+ char *filename = getLevelSetTitleMessageFilename(nr, initial);
+ struct TitleMessageInfo *tmi = getTitleMessageInfo(nr, initial);
+#if 0
int font_nr = FONT_TEXT_1;
int font_width;
int font_height;
- int pad_x = 16;
- int pad_y = 32;
+ int pad_x = 16 + 4;
+ int pad_y = 32 + 14;
int sx = pad_x;
int sy = pad_y;
int max_chars_per_line;
int max_lines_per_screen;
+#endif
int last_game_status = game_status; /* save current game status */
if (filename == NULL)
return;
+ /* force MESSAGE font on title message screen */
+ game_status = GAME_MODE_MESSAGE;
+
+ /* if chars set to "-1", automatically determine by text and font width */
+ if (tmi->chars == -1)
+ tmi->chars = tmi->width / getFontWidth(tmi->font);
+ else
+ tmi->width = tmi->chars * getFontWidth(tmi->font);
+
+ /* if lines set to "-1", automatically determine by text and font height */
+ if (tmi->lines == -1)
+ tmi->lines = tmi->height / getFontHeight(tmi->font);
+ else
+ tmi->height = tmi->lines * getFontHeight(tmi->font);
+
SetDrawBackgroundMask(REDRAW_ALL);
- SetWindowBackgroundImageIfDefined(IMG_BACKGROUND_MESSAGE);
+ SetWindowBackgroundImage(IMG_BACKGROUND_MESSAGE);
ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
- /* force MESSAGE font on title message screen */
- game_status = GAME_MODE_MESSAGE;
-
+#if 0
font_width = getFontWidth(font_nr);
font_height = getFontHeight(font_nr);
max_chars_per_line = (WIN_XSIZE - 2 * pad_x) / font_width;
max_lines_per_screen = (WIN_YSIZE - pad_y) / font_height - 1;
+#endif
- DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line,
- max_lines_per_screen, FALSE);
+#if 1
+ DrawTextFile(ALIGNED_TEXT_XPOS(tmi), ALIGNED_TEXT_YPOS(tmi),
+ filename, tmi->font, tmi->chars, -1, tmi->lines, -1,
+ tmi->autowrap, tmi->centered, tmi->skip_comments);
+#else
+ DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+ max_lines_per_screen, -1, tmi->autowrap, tmi->centered,
+ tmi->skip_comments);
+#endif
game_status = last_game_status; /* restore current game status */
}
{
KeyboardAutoRepeatOff();
+#if 0
SetMainBackgroundImage(IMG_BACKGROUND_TITLE);
+#endif
HandleTitleScreen(0, 0, 0, 0, MB_MENU_INITIALIZE);
StopAnimation();
}
+boolean CheckTitleScreen(boolean levelset_has_changed)
+{
+ static boolean show_title_initial = TRUE;
+ boolean show_titlescreen = FALSE;
+
+ /* needed to be able to skip title screen, if no image or message defined */
+ InitializeTitleControls(show_title_initial);
+
+ if (setup.show_titlescreen && (show_title_initial || levelset_has_changed))
+ show_titlescreen = TRUE;
+
+ /* show initial title images and messages only once at program start */
+ show_title_initial = FALSE;
+
+ return (show_titlescreen && num_title_screens > 0);
+}
+
void DrawMainMenuExt(int redraw_mask, boolean do_fading)
{
static LevelDirTree *leveldir_last_valid = NULL;
SetDrawtoField(DRAW_BACKBUFFER);
#endif
+#if 1
+ if (CheckTitleScreen(levelset_has_changed))
+ {
+ game_status = GAME_MODE_TITLE;
+
+ DrawTitleScreen();
+
+ return;
+ }
+
+#else
+
if (setup.show_titlescreen &&
((levelset_has_changed &&
(graphic_info[IMG_TITLESCREEN_1].bitmap != NULL ||
- getLevelSetMessageFilename() != NULL)) ||
- (show_titlescreen_initial &&
- graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL)))
+ getLevelSetMessageFilename(1, FALSE) != NULL)) ||
+ (show_title_initial &&
+ (graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL ||
+ getLevelSetMessageFilename(1, TRUE) != NULL))))
{
game_status = GAME_MODE_TITLE;
return;
}
+#endif
/* level_nr may have been set to value over handicap with level editor */
if (setup.handicap && level_nr > leveldir_current->handicap_level)
else
BackToFront();
+ SetMouseCursor(CURSOR_DEFAULT);
+
InitAnimation();
OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
}
#endif
+#if 1
+void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
+{
+ static unsigned long title_delay = 0;
+ static int title_screen_nr = 0;
+ boolean return_to_main_menu = FALSE;
+ boolean use_fading_main_menu = TRUE;
+#if 1
+ boolean use_cross_fading = FALSE;
+#else
+ boolean use_cross_fading = !show_title_initial; /* default */
+#endif
+ struct TitleControlInfo *tci;
+
+ if (button == MB_MENU_INITIALIZE)
+ {
+ int last_game_status = game_status; /* save current game status */
+
+ title_delay = 0;
+ title_screen_nr = 0;
+ tci = &title_controls[title_screen_nr];
+
+#if 0
+ /* determine number of title screens to display (images and messages) */
+ InitializeTitleControls();
+#endif
+
+ if (game_status == GAME_MODE_INFO)
+ {
+ if (num_title_screens == 0)
+ {
+ DrawInfoScreen_NotAvailable("Title screen information:",
+ "No title screen for this level set.");
+
+ title.auto_delay_final = -1;
+
+ return;
+ }
+
+ FadeSoundsAndMusic();
+
+ FadeOut(REDRAW_ALL);
+ }
+
+ /* force TITLE music on title info screen */
+ game_status = GAME_MODE_TITLE;
+
+ PlayMenuSound();
+ PlayMenuMusic();
+
+ game_status = last_game_status; /* restore current game status */
+
+ if (tci->is_image)
+ {
+ DrawTitleScreenImage(tci->local_nr, tci->initial);
+ }
+ else
+ {
+ DrawTitleScreenMessage(tci->local_nr, tci->initial);
+
+ title.fade_delay_final = title.fade_delay;
+ title.post_delay_final = title.post_delay;
+ title.auto_delay_final = -1;
+ }
+
+ SetMouseCursor(CURSOR_NONE);
+
+ FadeIn(REDRAW_ALL);
+
+ DelayReached(&title_delay, 0); /* reset delay counter */
+
+ return;
+ }
+
+ if (title.auto_delay_final > -1 &&
+ DelayReached(&title_delay, title.auto_delay_final))
+ button = MB_MENU_CHOICE;
+
+ if (button == MB_MENU_LEAVE)
+ {
+ return_to_main_menu = TRUE;
+ use_fading_main_menu = FALSE;
+ }
+ else if (button == MB_MENU_CHOICE)
+ {
+ int anim_mode;
+
+ if (game_status == GAME_MODE_INFO && num_title_screens == 0)
+ {
+ FadeOut(REDRAW_FIELD);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawAndFadeInInfoScreen(REDRAW_FIELD);
+
+ return;
+ }
+
+ title_screen_nr++;
+ tci = &title_controls[title_screen_nr];
+
+ if (tci->is_image)
+ anim_mode =
+ graphic_info[getTitleScreenGraphic(tci->local_nr,
+ tci->initial)].anim_mode;
+ else
+ anim_mode = ANIM_FADE; /* ??? */
+
+ use_cross_fading = (anim_mode == ANIM_FADE ? FALSE :
+ anim_mode == ANIM_CROSSFADE ? TRUE :
+ use_cross_fading);
+
+ if (title_screen_nr < num_title_screens)
+ {
+ if (!use_cross_fading)
+ FadeOut(REDRAW_ALL);
+
+ if (use_cross_fading)
+ FadeCrossSaveBackbuffer();
+
+ if (tci->is_image)
+ DrawTitleScreenImage(tci->local_nr, tci->initial);
+ else
+ DrawTitleScreenMessage(tci->local_nr, tci->initial);
+
+ if (use_cross_fading)
+ FadeCross(REDRAW_ALL);
+ else
+ FadeIn(REDRAW_ALL);
+
+ DelayReached(&title_delay, 0); /* reset delay counter */
+ }
+ else
+ {
+ FadeSoundsAndMusic();
+
+ FadeOut(REDRAW_ALL);
+
+ return_to_main_menu = TRUE;
+ }
+ }
+
+ if (return_to_main_menu)
+ {
+ RedrawBackground();
+
+ SetMouseCursor(CURSOR_DEFAULT);
+
+ if (game_status == GAME_MODE_INFO)
+ {
+ OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawInfoScreenExt(REDRAW_ALL, use_fading_main_menu);
+ }
+ else /* default: return to main menu */
+ {
+ OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+
+ game_status = GAME_MODE_MAIN;
+ DrawMainMenuExt(REDRAW_ALL, use_fading_main_menu);
+ }
+ }
+}
+
+#else
+
void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
{
static unsigned long title_delay = 0;
char *filename = getLevelSetMessageFilename();
boolean return_to_main_menu = FALSE;
boolean use_fading_main_menu = TRUE;
- boolean use_cross_fading = !show_titlescreen_initial; /* default */
+ boolean use_cross_fading = !show_title_initial; /* default */
boolean no_title_info = (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL &&
- filename == NULL);
+ getLevelSetMessageFilename(1, FALSE) == NULL);
if (button == MB_MENU_INITIALIZE)
{
title_nr = 0;
showing_message = FALSE;
- if (show_titlescreen_initial &&
- graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL)
- show_titlescreen_initial = FALSE;
+ if (show_title_initial &&
+ graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL &&
+ getLevelSetMessageFilename(1, TRUE) == NULL)
+ show_title_initial = FALSE;
if (game_status == GAME_MODE_INFO)
{
game_status = last_game_status; /* restore current game status */
- if (graphic_info[getTitleScreenGraphic()].bitmap != NULL)
+ if (graphic_info[getTitleScreenGraphic(0, show_title_initial)].bitmap != NULL)
{
- DrawTitleScreenImage(title_nr);
+ DrawTitleScreenImage(title_nr, show_title_initial);
}
else
{
title_nr++;
- if (show_titlescreen_initial &&
- (title_nr >= MAX_NUM_TITLE_SCREENS ||
+ if (show_title_initial &&
+ (title_nr >= MAX_NUM_TITLE_IMAGES ||
graphic_info[IMG_TITLESCREEN_INITIAL_1 + title_nr].bitmap == NULL))
{
- show_titlescreen_initial = FALSE;
+ show_title_initial = FALSE;
title_nr = 0; /* restart with title screens for current level set */
}
- anim_mode = graphic_info[getTitleScreenGraphic() + title_nr].anim_mode;
+ anim_mode = graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].anim_mode;
use_cross_fading = (anim_mode == ANIM_FADE ? FALSE :
anim_mode == ANIM_CROSSFADE ? TRUE :
if (!use_cross_fading)
FadeOut(REDRAW_ALL);
- if (title_nr < MAX_NUM_TITLE_SCREENS &&
- graphic_info[getTitleScreenGraphic() + title_nr].bitmap != NULL)
+ if (title_nr < MAX_NUM_TITLE_IMAGES &&
+ graphic_info[getTitleScreenGraphic(title_nr, show_title_initial)].bitmap != NULL)
{
if (use_cross_fading)
FadeCrossSaveBackbuffer();
- DrawTitleScreenImage(title_nr);
+ DrawTitleScreenImage(title_nr, show_title_initial);
if (use_cross_fading)
FadeCross(REDRAW_ALL);
if (return_to_main_menu)
{
- show_titlescreen_initial = FALSE;
+ show_title_initial = FALSE;
RedrawBackground();
}
}
}
+#endif
void HandleMainMenu_SelectLevel(int step, int direction)
{
if (new_level_nr != old_level_nr)
{
- struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_CURRENT_LEVEL);
+ struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_LEVEL_NUMBER);
PlaySound(SND_MENU_ITEM_SELECTING);
#if 1
DrawText(mSX + mci->pos_text->x, mSY + mci->pos_text->y,
- int2str(level_nr, 3), mci->font_text);
+ int2str(level_nr, 3), mci->pos_text->font);
#else
DrawText(mSX + 11 * 32, mSY + 3 * 32, int2str(level_nr, 3), FONT_VALUE_1);
#endif
{
if (insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY) ||
insideTextPosRect(main_controls[i].pos_text, mx - mSX, my - mSY) ||
- insideMenuPosRect(main_controls[i].pos_input, mx - mSX, my - mSY))
+ insideTextPosRect(main_controls[i].pos_input, mx - mSX, my - mSY))
{
pos = main_controls[i].nr;
void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
{
+#if 1
+ int ystart1 = mSY - SY + 100;
+ int ystart2 = mSY - SY + 150;
+ int ybottom = mSY - SY + SYSIZE - 20;
+#else
int ystart1 = 100;
int ystart2 = 150;
int ybottom = SYSIZE - 20;
+#endif
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
static int infoscreen_step[MAX_INFO_ELEMENTS_ON_SCREEN];
static int infoscreen_frame[MAX_INFO_ELEMENTS_ON_SCREEN];
int xstart = mSX + 16;
- int ystart = mSY + 64 + 2 * 32;
+ int ystart1 = mSY - SY + 100;
+ int ystart2 = mSY + 64 + 2 * 32;
+ int ybottom = mSY - SY + SYSIZE - 20;
int ystep = TILEY + 4;
int element, action, direction;
int graphic;
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, "The Game Elements:");
+ DrawTextSCentered(ystart1, FONT_TEXT_1, "The Game Elements:");
- DrawTextSCentered(SYSIZE - 20, FONT_TEXT_4,
+ DrawTextSCentered(ybottom, FONT_TEXT_4,
"Press any key or button for next page");
FrameCounter = 0;
j++;
- ClearRectangleOnBackground(drawto, xstart, ystart + (i - start) * ystep,
+ ClearRectangleOnBackground(drawto, xstart, ystart2 + (i - start) * ystep,
TILEX, TILEY);
- DrawGraphicAnimationExt(drawto, xstart, ystart + (i - start) * ystep,
+ DrawGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep,
graphic, sync_frame, USE_MASKING);
if (init)
if (strlen(text) <= max_chars_per_line) /* only one line of text */
sy += getFontHeight(font_nr) / 2;
+#if 1
+ DrawTextBuffer(sx, sy + ypos * ystep, text, font_nr,
+ max_chars_per_line, -1, max_lines_per_text, -1,
+ TRUE, FALSE, FALSE);
+#else
DrawTextWrapped(sx, sy + ypos * ystep, text, font_nr,
max_chars_per_line, max_lines_per_text);
+#endif
}
void DrawInfoScreen_TitleScreen()
void HandleInfoScreen_Music(int button)
{
static struct MusicFileInfo *list = NULL;
- int ystart = 150, dy = 30;
- int ybottom = SYSIZE - 20;
+ int ystart1 = mSY - SY + 100;
+ int ystart2 = mSY - SY + 150;
+ int ybottom = mSY - SY + SYSIZE - 20;
+ int dy = 30;
if (button == MB_MENU_INITIALIZE)
{
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, "No music info for this level set.");
+ DrawTextSCentered(ystart1, FONT_TEXT_1,
+ "No music info for this level set.");
DrawTextSCentered(ybottom, FONT_TEXT_4,
"Press any key or button for info menu");
else
PlaySound(sound);
- DrawTextSCentered(100, FONT_TEXT_1, "The Game Background Sounds:");
+ DrawTextSCentered(ystart1, FONT_TEXT_1, "The Game Background Sounds:");
}
else
{
PlayMusic(list->music);
- DrawTextSCentered(100, FONT_TEXT_1, "The Game Background Music:");
+ DrawTextSCentered(ystart1, FONT_TEXT_1, "The Game Background Music:");
}
if (!strEqual(list->title, UNKNOWN_NAME))
{
if (!strEqual(list->title_header, UNKNOWN_NAME))
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->title_header);
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, list->title_header);
- DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "\"%s\"", list->title);
+ DrawTextFCentered(ystart2 + y++ * dy, FONT_TEXT_3, "\"%s\"", list->title);
}
if (!strEqual(list->artist, UNKNOWN_NAME))
{
if (!strEqual(list->artist_header, UNKNOWN_NAME))
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->artist_header);
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, list->artist_header);
else
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, "by");
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, "by");
- DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "%s", list->artist);
+ DrawTextFCentered(ystart2 + y++ * dy, FONT_TEXT_3, "%s", list->artist);
}
if (!strEqual(list->album, UNKNOWN_NAME))
{
if (!strEqual(list->album_header, UNKNOWN_NAME))
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->album_header);
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, list->album_header);
else
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, "from the album");
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, "from the album");
- DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "\"%s\"", list->album);
+ DrawTextFCentered(ystart2 + y++ * dy, FONT_TEXT_3, "\"%s\"", list->album);
}
if (!strEqual(list->year, UNKNOWN_NAME))
{
if (!strEqual(list->year_header, UNKNOWN_NAME))
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->year_header);
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, list->year_header);
else
- DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, "from the year");
+ DrawTextSCentered(ystart2 + y++ * dy, FONT_TEXT_2, "from the year");
- DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "%s", list->year);
+ DrawTextFCentered(ystart2 + y++ * dy, FONT_TEXT_3, "%s", list->year);
}
DrawTextSCentered(ybottom, FONT_TEXT_4,
static boolean DrawInfoScreen_CreditsScreen(int screen_nr)
{
- int ystart = 150, ystep = 30;
- int ybottom = SYSIZE - 20;
+ int ystart1 = mSY - SY + 100;
+ int ystart2 = mSY - SY + 150;
+ int ybottom = mSY - SY + SYSIZE - 20;
+ int ystep = 30;
if (screen_nr > 8)
return FALSE;
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, "Credits:");
+ DrawTextSCentered(ystart1, FONT_TEXT_1, "Credits:");
if (screen_nr == 0)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Special thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Peter Liepa");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for creating");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"\"Boulder Dash\"");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"in the year");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
"1984");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_2,
"published by");
- DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_3,
"First Star Software");
}
else if (screen_nr == 1)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Special thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Klaus Heinz & Volker Wertich");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for creating");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"\"Emerald Mine\"");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"in the year");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
"1987");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_2,
"published by");
- DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_3,
"Kingsoft");
}
else if (screen_nr == 2)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Special thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Michael Stopp & Philip Jespersen");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for creating");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"\"Supaplex\"");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"in the year");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
"1991");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_2,
"published by");
- DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_3,
"Digital Integration");
}
else if (screen_nr == 3)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Special thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Hiroyuki Imabayashi");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for creating");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"\"Sokoban\"");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"in the year");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
"1982");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_2,
"published by");
- DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_3,
"Thinking Rabbit");
}
else if (screen_nr == 4)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Special thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Alan Bond");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"and");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"Jürgen Bonhagen");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"for the continuous creation");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_2,
"of outstanding level sets");
}
else if (screen_nr == 5)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Peter Elzner");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for ideas and inspiration by");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"Diamond Caves");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_2,
"Thanks to");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_3,
"Steffest");
- DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_2,
"for ideas and inspiration by");
- DrawTextSCentered(ystart + 8 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 8 * ystep, FONT_TEXT_3,
"DX-Boulderdash");
}
else if (screen_nr == 6)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"David Tritscher");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for the new Emerald Mine engine");
}
else if (screen_nr == 7)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"Thanks to");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
"Guido Schulz");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"for the initial DOS port");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"Thanks to");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
"Karl Hörnell");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_2,
"for some additional toons");
}
else if (screen_nr == 8)
{
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"And not to forget:");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_2,
"Many thanks to");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_3,
"All those who contributed");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
"levels to this game");
- DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_3,
"since 1995");
}
#if 0
void DrawInfoScreen_Program()
{
- int ystart = 150, ystep = 30;
- int ybottom = SYSIZE - 20;
+ int ystart1 = mSY - SY + 100;
+ int ystart2 = mSY - SY + 150;
+ int ybottom = mSY - SY + SYSIZE - 20;
+ int ystep = 30;
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM);
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, "Program Information:");
+ DrawTextSCentered(ystart1, FONT_TEXT_1, "Program Information:");
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 0 * ystep, FONT_TEXT_2,
"This game is Freeware!");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_2,
"If you like it, send e-mail to:");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_3,
PROGRAM_EMAIL_STRING);
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_2,
"or SnailMail to:");
- DrawTextSCentered(ystart + 4 * ystep + 0, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 4 * ystep + 0, FONT_TEXT_3,
"Holger Schemel");
- DrawTextSCentered(ystart + 4 * ystep + 20, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 4 * ystep + 20, FONT_TEXT_3,
"Detmolder Strasse 189");
- DrawTextSCentered(ystart + 4 * ystep + 40, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 4 * ystep + 40, FONT_TEXT_3,
"33604 Bielefeld");
- DrawTextSCentered(ystart + 4 * ystep + 60, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 4 * ystep + 60, FONT_TEXT_3,
"Germany");
- DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_2,
"More information and levels:");
- DrawTextSCentered(ystart + 8 * ystep, FONT_TEXT_3,
+ DrawTextSCentered(ystart2 + 8 * ystep, FONT_TEXT_3,
PROGRAM_WEBSITE_STRING);
- DrawTextSCentered(ystart + 9 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 9 * ystep, FONT_TEXT_2,
"If you have created new levels,");
- DrawTextSCentered(ystart + 10 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 10 * ystep, FONT_TEXT_2,
"send them to me to include them!");
- DrawTextSCentered(ystart + 11 * ystep, FONT_TEXT_2,
+ DrawTextSCentered(ystart2 + 11 * ystep, FONT_TEXT_2,
":-)");
DrawTextSCentered(ybottom, FONT_TEXT_4,
int font_text = FONT_TEXT_2;
int xstep = getFontWidth(font_text);
int ystep = getFontHeight(font_text);
- int ystart = 150;
- int ybottom = SYSIZE - 20;
- int xstart1 = SX + 2 * xstep;
- int xstart2 = SX + 18 * xstep;
+ int ystart1 = mSY - SY + 100;
+ int ystart2 = mSY - SY + 150;
+ int ybottom = mSY - SY + SYSIZE - 20;
+ int xstart1 = mSX + 2 * xstep;
+ int xstart2 = mSX + 19 * xstep;
#if defined(TARGET_SDL)
- int xstart3 = SX + 28 * xstep;
+ int xstart3 = mSX + 29 * xstep;
SDL_version sdl_version_compiled;
const SDL_version *sdl_version_linked;
+ int driver_name_len = 8;
+ char driver_name[driver_name_len];
#endif
- SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM);
+ SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION);
FadeOut(REDRAW_FIELD);
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, "Version Information:");
+ DrawTextSCentered(ystart1, FONT_TEXT_1, "Version Information:");
- DrawTextF(xstart1, ystart, font_header, "Name");
- DrawTextF(xstart2, ystart, font_text, PROGRAM_TITLE_STRING);
+ DrawTextF(xstart1, ystart2, font_header, "Name");
+ DrawTextF(xstart2, ystart2, font_text, PROGRAM_TITLE_STRING);
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_header, "Version");
- DrawTextF(xstart2, ystart, font_text, getProgramFullVersionString());
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Version");
+ DrawTextF(xstart2, ystart2, font_text, getProgramFullVersionString());
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_header, "Platform");
- DrawTextF(xstart2, ystart, font_text, PLATFORM_STRING);
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Platform");
+ DrawTextF(xstart2, ystart2, font_text, PLATFORM_STRING);
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_header, "Target");
- DrawTextF(xstart2, ystart, font_text, TARGET_STRING);
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Target");
+ DrawTextF(xstart2, ystart2, font_text, TARGET_STRING);
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_header, "Compile time");
- DrawTextF(xstart2, ystart, font_text, getCompileDateString());
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Compile time");
+ DrawTextF(xstart2, ystart2, font_text, getCompileDateString());
#if defined(TARGET_SDL)
- ystart += 3 * ystep;
- DrawTextF(xstart1, ystart, font_header, "Library");
- DrawTextF(xstart2, ystart, font_header, "compiled");
- DrawTextF(xstart3, ystart, font_header, "linked");
+ ystart2 += 3 * ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Library");
+ DrawTextF(xstart2, ystart2, font_header, "compiled");
+ DrawTextF(xstart3, ystart2, font_header, "linked");
SDL_VERSION(&sdl_version_compiled);
sdl_version_linked = SDL_Linked_Version();
- ystart += 2 * ystep;
- DrawTextF(xstart1, ystart, font_text, "SDL");
- DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ ystart2 += 2 * ystep;
+ DrawTextF(xstart1, ystart2, font_text, "SDL");
+ DrawTextF(xstart2, ystart2, font_text, "%d.%d.%d",
sdl_version_compiled.major,
sdl_version_compiled.minor,
sdl_version_compiled.patch);
- DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ DrawTextF(xstart3, ystart2, font_text, "%d.%d.%d",
sdl_version_linked->major,
sdl_version_linked->minor,
sdl_version_linked->patch);
SDL_IMAGE_VERSION(&sdl_version_compiled);
sdl_version_linked = IMG_Linked_Version();
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_text, "SDL_image");
- DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_text, "SDL_image");
+ DrawTextF(xstart2, ystart2, font_text, "%d.%d.%d",
sdl_version_compiled.major,
sdl_version_compiled.minor,
sdl_version_compiled.patch);
- DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ DrawTextF(xstart3, ystart2, font_text, "%d.%d.%d",
sdl_version_linked->major,
sdl_version_linked->minor,
sdl_version_linked->patch);
SDL_MIXER_VERSION(&sdl_version_compiled);
sdl_version_linked = Mix_Linked_Version();
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_text, "SDL_mixer");
- DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_text, "SDL_mixer");
+ DrawTextF(xstart2, ystart2, font_text, "%d.%d.%d",
sdl_version_compiled.major,
sdl_version_compiled.minor,
sdl_version_compiled.patch);
- DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ DrawTextF(xstart3, ystart2, font_text, "%d.%d.%d",
sdl_version_linked->major,
sdl_version_linked->minor,
sdl_version_linked->patch);
SDL_NET_VERSION(&sdl_version_compiled);
sdl_version_linked = SDLNet_Linked_Version();
- ystart += ystep;
- DrawTextF(xstart1, ystart, font_text, "SDL_net");
- DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_text, "SDL_net");
+ DrawTextF(xstart2, ystart2, font_text, "%d.%d.%d",
sdl_version_compiled.major,
sdl_version_compiled.minor,
sdl_version_compiled.patch);
- DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ DrawTextF(xstart3, ystart2, font_text, "%d.%d.%d",
sdl_version_linked->major,
sdl_version_linked->minor,
sdl_version_linked->patch);
+
+ ystart2 += 3 * ystep;
+ DrawTextF(xstart1, ystart2, font_header, "Driver");
+ DrawTextF(xstart2, ystart2, font_header, "Requested");
+ DrawTextF(xstart3, ystart2, font_header, "Used");
+
+ SDL_VideoDriverName(driver_name, driver_name_len);
+
+ ystart2 += 2 * ystep;
+ DrawTextF(xstart1, ystart2, font_text, "SDL_VideoDriver");
+ DrawTextF(xstart2, ystart2, font_text, "%s", setup.system.sdl_videodriver);
+ DrawTextF(xstart3, ystart2, font_text, "%s", driver_name);
+
+ SDL_AudioDriverName(driver_name, driver_name_len);
+
+ ystart2 += ystep;
+ DrawTextF(xstart1, ystart2, font_text, "SDL_AudioDriver");
+ DrawTextF(xstart2, ystart2, font_text, "%s", setup.system.sdl_audiodriver);
+ DrawTextF(xstart3, ystart2, font_text, "%s", driver_name);
#endif
DrawTextSCentered(ybottom, FONT_TEXT_4,
void DrawInfoScreen_LevelSet()
{
- int ystart = 150;
- int ybottom = SYSIZE - 20;
+ struct TitleMessageInfo *tmi = &readme;
char *filename = getLevelSetInfoFilename();
-#if 1
- int font_nr = FONT_INFO_LEVELSET;
-#else
- int font_nr = FONT_LEVEL_NUMBER;
-#endif
- int font_width = getFontWidth(font_nr);
- int font_height = getFontHeight(font_nr);
- int pad_x = 32;
- int pad_y = ystart;
- 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;
+
+ /* if chars set to "-1", automatically determine by text and font width */
+ if (tmi->chars == -1)
+ tmi->chars = tmi->width / getFontWidth(tmi->font);
+ else
+ tmi->width = tmi->chars * getFontWidth(tmi->font);
+
+ /* if lines set to "-1", automatically determine by text and font height */
+ if (tmi->lines == -1)
+ tmi->lines = tmi->height / getFontHeight(tmi->font);
+ else
+ tmi->height = tmi->lines * getFontHeight(tmi->font);
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, "Level Set Information:");
-
- DrawTextSCentered(ybottom, FONT_TEXT_4,
- "Press any key or button for info menu");
+ DrawTextCentered(mSY + 100, FONT_TEXT_1, "Level Set Information:");
if (filename != NULL)
- DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line,
- max_lines_per_screen, TRUE);
+ DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi),
+ filename, tmi->font, tmi->chars, -1, tmi->lines, -1,
+ tmi->autowrap, tmi->centered, tmi->skip_comments);
else
- DrawTextSCentered(ystart, FONT_TEXT_2,
- "No information for this level set.");
+ DrawTextCentered(mSY + ALIGNED_TEXT_YPOS(tmi), FONT_TEXT_2,
+ "No information for this level set.");
+
+ DrawTextCentered(mSY + SYSIZE - 20, FONT_TEXT_4,
+ "Press any key or button for info menu");
FadeIn(REDRAW_FIELD);
}
static char last_player_name[MAX_PLAYER_NAME_LEN + 1];
struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
#if 1
- struct MenuPosInfo *pos = mci->pos_input;
- int startx = mSX + ALIGNED_MENU_XPOS(pos);
- int starty = mSY + ALIGNED_MENU_YPOS(pos);
+ struct TextPosInfo *pos = mci->pos_input;
+ int startx = mSX + ALIGNED_TEXT_XPOS(pos);
+ int starty = mSY + ALIGNED_TEXT_YPOS(pos);
#endif
#if 1
static int xpos = 0;
#else
static int xpos = 0, ypos = 2;
#endif
- int font_nr = mci->font_input;
+ int font_nr = pos->font;
int font_active_nr = FONT_ACTIVE(font_nr);
int font_width = getFontWidth(font_active_nr);
#if 1
#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);
}
}
else if (game_status == GAME_MODE_SETUP)
{
- if (game_status == GAME_MODE_SETUP)
- {
- if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
- execSetupGraphics();
- else
- execSetupArtwork();
- }
+ if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
+ execSetupGame();
+ else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
+ execSetupGraphics();
+ else
+ execSetupArtwork();
}
else
{
if (game_status == GAME_MODE_SETUP)
{
- if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
+ if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
+ execSetupGame();
+ else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
execSetupGraphics();
else
execSetupArtwork();
static int num_setup_info;
static char *screen_mode_text;
+static char *game_speed_text;
static char *graphics_set_name;
static char *sounds_set_name;
static char *music_set_name;
static void execSetupGame()
{
+ if (game_speeds == NULL)
+ {
+ int i;
+
+ for (i = 0; game_speeds_list[i].value != -1; i++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+ char identifier[32], name[32];
+ int value = game_speeds_list[i].value;
+ char *text = game_speeds_list[i].text;
+
+ ti->node_top = &game_speeds;
+ ti->sort_priority = 10000 - value;
+
+ sprintf(identifier, "%d", value);
+ sprintf(name, "%s", text);
+
+ setString(&ti->identifier, identifier);
+ setString(&ti->name, name);
+ setString(&ti->name_sorting, name);
+ setString(&ti->infotext, "Game Speed");
+
+ pushTreeInfo(&game_speeds, ti);
+ }
+
+ /* sort game speed values to start with slowest game speed */
+ sortTreeInfo(&game_speeds);
+
+ /* set current game speed to configured game speed value */
+ game_speed_current =
+ getTreeInfoFromIdentifier(game_speeds, i_to_a(setup.game_frame_delay));
+
+ /* if that fails, set current game speed to reliable default value */
+ if (game_speed_current == NULL)
+ game_speed_current =
+ getTreeInfoFromIdentifier(game_speeds, i_to_a(GAME_FRAME_DELAY));
+
+ /* if that also fails, set current game speed to first available speed */
+ if (game_speed_current == NULL)
+ game_speed_current = game_speeds;
+ }
+
+ setup.game_frame_delay = atoi(game_speed_current->identifier);
+
+ /* needed for displaying game speed text instead of identifier */
+ game_speed_text = game_speed_current->name;
+
setup_mode = SETUP_MODE_GAME;
DrawSetupScreen();
}
+static void execSetupChooseGameSpeed()
+{
+ setup_mode = SETUP_MODE_CHOOSE_GAME_SPEED;
+ DrawSetupScreen();
+}
+
static void execSetupEditor()
{
setup_mode = SETUP_MODE_EDITOR;
ti->sort_priority = x * 10000 + y;
sprintf(identifier, "%dx%d", x, y);
- sprintf(name, "%d x %d [%d:%d]", x, y, xx, yy);
+ sprintf(name, "%d x %d [%d:%d]", x, y, xx, yy);
setString(&ti->identifier, identifier);
setString(&ti->name, name);
{ TYPE_SWITCH, &setup.skip_levels, "Skip Unsolved Levels:" },
{ TYPE_SWITCH, &setup.time_limit, "Time Limit:" },
{ TYPE_SWITCH, &setup.autorecord, "Auto-Record Tapes:" },
+ { TYPE_ENTER_LIST, execSetupChooseGameSpeed, "Game Speed:" },
+ { TYPE_STRING, &game_speed_text, "" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
if (setup_mode == SETUP_MODE_INPUT)
DrawSetupScreen_Input();
+ else if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
+ DrawChooseTree(&game_speed_current);
else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
DrawChooseTree(&screen_mode_current);
else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)
{
if (setup_mode == SETUP_MODE_INPUT)
HandleSetupScreen_Input(mx, my, dx, dy, button);
+ else if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
+ HandleChooseTree(mx, my, dx, dy, button, &game_speed_current);
else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE)
HandleChooseTree(mx, my, dx, dy, button, &screen_mode_current);
else if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS)