static void MapScreenTreeGadgets(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 char main_text_last_level[10];
static char main_input_name[MAX_PLAYER_NAME_LEN + 1];
-static struct
+struct MainControlInfo
{
int nr;
struct MenuPosInfo *pos_input;
char *input;
int font_input;
-}
-main_controls[] =
+};
+
+static struct MainControlInfo main_controls[] =
{
{
MAIN_CONTROL_NAME,
NULL, NULL, -1,
},
#if 0
+ /* (these two buttons are real gadgets) */
{
MAIN_CONTROL_PREV_LEVEL,
&menu.main.button.prev_level, IMG_MENU_BUTTON_PREV_LEVEL,
/* set main control screen positions to dynamically determined values */
for (i = 0; main_controls[i].nr != -1; i++)
{
- int nr = main_controls[i].nr;
- struct MenuPosInfo *pos_button = main_controls[i].pos_button;
- struct MenuPosInfo *pos_text = main_controls[i].pos_text;
- struct MenuPosInfo *pos_input = main_controls[i].pos_input;
- char *text = main_controls[i].text;
- char *input = main_controls[i].input;
- int button_graphic = main_controls[i].button_graphic;
- int font_text = main_controls[i].font_text;
- int font_input = main_controls[i].font_input;
+ struct MainControlInfo *mci = &main_controls[i];
+ int nr = mci->nr;
+ struct MenuPosInfo *pos_button = mci->pos_button;
+ struct MenuPosInfo *pos_text = mci->pos_text;
+ struct MenuPosInfo *pos_input = mci->pos_input;
+ char *text = mci->text;
+ char *input = mci->input;
+ int button_graphic = mci->button_graphic;
+ int font_text = mci->font_text;
+ int font_input = mci->font_input;
int font_text_width = (font_text != -1 ? getFontWidth(font_text) : 0);
int font_text_height = (font_text != -1 ? getFontHeight(font_text) : 0);
}
}
-static void DrawCursorAndText_Main(int pos, boolean active)
+static void DrawCursorAndText_Main(int nr, boolean active)
{
int i;
for (i = 0; main_controls[i].nr != -1; i++)
{
- if (main_controls[i].nr == pos || pos == -1)
+ struct MainControlInfo *mci = &main_controls[i];
+
+ if (mci->nr == nr || nr == -1)
{
- struct MenuPosInfo *pos_button = main_controls[i].pos_button;
- struct MenuPosInfo *pos_text = main_controls[i].pos_text;
- struct MenuPosInfo *pos_input = main_controls[i].pos_input;
- char *text = main_controls[i].text;
- char *input = main_controls[i].input;
- int button_graphic = main_controls[i].button_graphic;
- int font_text = main_controls[i].font_text;
- int font_input = main_controls[i].font_input;
+ struct MenuPosInfo *pos_button = mci->pos_button;
+ struct MenuPosInfo *pos_text = mci->pos_text;
+ struct MenuPosInfo *pos_input = mci->pos_input;
+ char *text = mci->text;
+ char *input = mci->input;
+ int button_graphic = mci->button_graphic;
+ int font_text = mci->font_text;
+ int font_input = mci->font_input;
if (active)
{
}
}
+static struct MainControlInfo *getMainControlInfo(int nr)
+{
+ int i;
+
+ for (i = 0; main_controls[i].nr != -1; i++)
+ if (main_controls[i].nr == nr)
+ return &main_controls[i];
+
+ return NULL;
+}
+
static boolean insideMenuPosRect(struct MenuPosInfo *rect, int x, int y)
{
+ if (rect == NULL)
+ return FALSE;
+
int rect_x = ALIGNED_XPOS(rect->x, rect->width, rect->align);
int rect_y = rect->y;
- return (rect != NULL &&
- x >= rect_x && x < rect_x + rect->width &&
+ 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);
+}
+
void DrawTitleScreenImage(int nr)
{
- int graphic = IMG_TITLESCREEN_1 + nr;
+ int graphic = getTitleScreenGraphic() + nr;
Bitmap *bitmap = graphic_info[graphic].bitmap;
int width = graphic_info[graphic].src_image_width;
int height = graphic_info[graphic].src_image_height;
BlitBitmap(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
redraw_mask = REDRAW_ALL;
+
+ /* reset fading control values to default config settings */
+ title.fade_delay_final = title.fade_delay;
+ title.post_delay_final = title.post_delay;
+ title.auto_delay_final = title.auto_delay;
+
+ /* override default settings with image config settings, if defined */
+ if (graphic_info[graphic].fade_delay > -1)
+ title.fade_delay_final = graphic_info[graphic].fade_delay;
+ if (graphic_info[graphic].post_delay > -1)
+ title.post_delay_final = graphic_info[graphic].post_delay;
+ if (graphic_info[graphic].auto_delay > -1)
+ title.auto_delay_final = graphic_info[graphic].auto_delay;
}
void DrawTitleScreen()
#endif
if (setup.show_titlescreen &&
- levelset_has_changed &&
- graphic_info[IMG_TITLESCREEN_1].bitmap != NULL)
+ ((levelset_has_changed &&
+ graphic_info[IMG_TITLESCREEN_1].bitmap != NULL) ||
+ (show_titlescreen_initial &&
+ graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL)))
{
game_status = GAME_MODE_TITLE;
void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
{
+ static unsigned long title_delay = 0;
static int title_nr = 0;
boolean return_to_main_menu = FALSE;
boolean use_fading_main_menu = TRUE;
- boolean use_cross_fading = TRUE;
+ boolean use_cross_fading = !show_titlescreen_initial; /* default */
if (button == MB_MENU_INITIALIZE)
{
int last_game_status = game_status; /* save current game status */
+
+ title_delay = 0;
title_nr = 0;
+ if (show_titlescreen_initial &&
+ graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL)
+ show_titlescreen_initial = FALSE;
+
if (game_status == GAME_MODE_INFO)
{
if (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL)
FadeIn(REDRAW_ALL);
+ DelayReached(&title_delay, 0); /* reset delay counter */
+
return;
}
- else if (button == MB_MENU_LEAVE)
+
+ 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 &&
graphic_info[IMG_TITLESCREEN_1].bitmap == NULL)
{
title_nr++;
+ if (show_titlescreen_initial &&
+ (title_nr >= MAX_NUM_TITLE_SCREENS ||
+ graphic_info[IMG_TITLESCREEN_INITIAL_1 + title_nr].bitmap == NULL))
+ {
+ show_titlescreen_initial = FALSE;
+
+ title_nr = 0; /* restart with title screens for current level set */
+ }
+
+ anim_mode = graphic_info[getTitleScreenGraphic() + title_nr].anim_mode;
+
+ use_cross_fading = (anim_mode == ANIM_FADE ? FALSE :
+ anim_mode == ANIM_CROSSFADE ? TRUE :
+ use_cross_fading);
+
if (!use_cross_fading)
FadeOut(REDRAW_ALL);
if (title_nr < MAX_NUM_TITLE_SCREENS &&
- graphic_info[IMG_TITLESCREEN_1 + title_nr].bitmap != NULL)
+ graphic_info[getTitleScreenGraphic() + title_nr].bitmap != NULL)
{
if (use_cross_fading)
FadeCrossSaveBackbuffer();
FadeCross(REDRAW_ALL);
else
FadeIn(REDRAW_ALL);
+
+ DelayReached(&title_delay, 0); /* reset delay counter */
}
else
{
if (return_to_main_menu)
{
+ show_titlescreen_initial = FALSE;
+
RedrawBackground();
if (game_status == GAME_MODE_INFO)
if (new_level_nr != old_level_nr)
{
+ struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_CURRENT_LEVEL);
+
level_nr = new_level_nr;
+#if 1
+ DrawText(mSX + mci->pos_text->x, mSY + mci->pos_text->y,
+ int2str(level_nr, 3), mci->font_text);
+#else
DrawText(mSX + 11 * 32, mSY + 3 * 32, int2str(level_nr, 3), FONT_VALUE_1);
+#endif
LoadLevel(level_nr);
DrawPreviewLevel(TRUE);
static int num_pages;
static int page;
int anims_per_page = MAX_INFO_ELEMENTS_ON_SCREEN;
- int button_released = !button;
int i;
if (button == MB_MENU_INITIALIZE)
boolean new_element = TRUE;
num_anims = 0;
+
for (i = 0; helpanim_info[i].element != HELPANIM_LIST_END; i++)
{
if (helpanim_info[i].element == HELPANIM_LIST_NEXT)
num_pages = (num_anims + anims_per_page - 1) / anims_per_page;
page = 0;
}
- else if (button == MB_MENU_LEAVE)
+
+ if (button == MB_MENU_LEAVE)
{
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
return;
}
-
- if (button_released || button == MB_MENU_INITIALIZE)
+ else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE)
{
if (button != MB_MENU_INITIALIZE)
page++;
static struct MusicFileInfo *list = NULL;
int ystart = 150, dy = 30;
int ybottom = SYSIZE - 20;
- int button_released = !button;
if (button == MB_MENU_INITIALIZE)
{
return;
}
}
- else if (button == MB_MENU_LEAVE)
+
+ if (button == MB_MENU_LEAVE)
{
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
return;
}
-
- if (button_released || button == MB_MENU_INITIALIZE)
+ else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE)
{
int y = 0;
void HandleInfoScreen_Program(int button)
{
- int button_released = !button;
-
if (button == MB_MENU_LEAVE)
{
info_mode = INFO_MODE_MAIN;
return;
}
-
- if (button_released)
+ else if (button == MB_MENU_CHOICE)
{
FadeSoundsAndMusic();
FadeOut(REDRAW_FIELD);
void HandleInfoScreen_LevelSet(int button)
{
- int button_released = !button;
-
if (button == MB_MENU_LEAVE)
{
info_mode = INFO_MODE_MAIN;
return;
}
-
- if (button_released)
+ else if (button == MB_MENU_CHOICE)
{
FadeSoundsAndMusic();
FadeOut(REDRAW_FIELD);
void HandleTypeName(int newxpos, Key key)
{
+ struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
+#if 1
+ static int xpos = 0;
+#else
static int xpos = 0, ypos = 2;
- int font_width = getFontWidth(FONT_INPUT_1_ACTIVE);
+#endif
+ int font_nr = mci->font_input;
+ int font_active_nr = FONT_ACTIVE(font_nr);
+ int font_width = getFontWidth(font_active_nr);
+#if 1
+ int startx = mSX + mci->pos_input->x;
+ int starty = mSY + mci->pos_input->y;
+#else
int name_width = getFontWidth(FONT_MENU_1) * strlen("Name:");
int startx = mSX + 32 + name_width;
int starty = mSY + ypos * 32;
+#endif
if (newxpos)
{
xpos = newxpos;
- DrawText(startx, starty, setup.player_name, FONT_INPUT_1_ACTIVE);
- DrawText(startx + xpos * font_width, starty, "_", FONT_INPUT_1_ACTIVE);
+ DrawText(startx, starty, setup.player_name, font_active_nr);
+ DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
return;
}
setup.player_name[xpos] = ascii;
setup.player_name[xpos + 1] = 0;
+
xpos++;
- DrawText(startx, starty, setup.player_name, FONT_INPUT_1_ACTIVE);
- DrawText(startx + xpos * font_width, starty, "_", FONT_INPUT_1_ACTIVE);
+ DrawText(startx, starty, setup.player_name, font_active_nr);
+ DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
}
else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0)
{
xpos--;
+
setup.player_name[xpos] = 0;
- DrawText(startx + xpos * font_width, starty, "_ ", FONT_INPUT_1_ACTIVE);
+ DrawText(startx + xpos * font_width, starty, "_ ", font_active_nr);
}
else if (key == KSYM_Return && xpos > 0)
{
- DrawText(startx, starty, setup.player_name, FONT_INPUT_1);
- DrawText(startx + xpos * font_width, starty, " ", FONT_INPUT_1_ACTIVE);
+ DrawText(startx, starty, setup.player_name, font_nr);
+ DrawText(startx + xpos * font_width, starty, " ", font_active_nr);
SaveSetup();
+
game_status = GAME_MODE_MAIN;
}
}
{
UnmapAllGadgets();
FadeSoundsAndMusic();
+
+ /* (this is needed when called from GameEnd() after winning a game) */
+ KeyboardAutoRepeatOn();
+ ActivateJoystick();
+
+ /* (this is needed when called from GameEnd() after winning a game) */
+ SetDrawDeactivationMask(REDRAW_NONE);
+ SetDrawBackgroundMask(REDRAW_FIELD);
+
CloseDoor(DOOR_CLOSE_2);
if (highlight_position < 0)
NextEvent(&event);
- switch(event.type)
+ switch (event.type)
{
case EVENT_KEYPRESS:
{
NextEvent(&event);
- switch(event.type)
+ switch (event.type)
{
case EVENT_KEYPRESS:
{
NextEvent(&event);
- switch(event.type)
+ switch (event.type)
{
case EVENT_KEYPRESS:
- switch(GetEventKey((KeyEvent *)&event, TRUE))
+ switch (GetEventKey((KeyEvent *)&event, TRUE))
{
case KSYM_Return:
if (check_remaining == 0)