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 TreeInfo *screen_modes = NULL;
static TreeInfo *screen_mode_current = NULL;
-#define DRAW_OFFSET_MODE(x) (x >= GAME_MODE_MAIN && \
- x <= GAME_MODE_SETUP ? x : \
- x == GAME_MODE_PSEUDO_TYPENAME ? \
+#define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \
+ (s) <= GAME_MODE_SETUP ? (s) : \
+ (s) == GAME_MODE_PSEUDO_TYPENAME ? \
GAME_MODE_MAIN : GAME_MODE_DEFAULT)
-#define mSX (SX + menu.draw_xoffset[DRAW_OFFSET_MODE(game_status)])
-#define mSY (SY + menu.draw_yoffset[DRAW_OFFSET_MODE(game_status)])
+#define DRAW_MODE_INFO(i) ((i) >= INFO_MODE_ELEMENTS && \
+ (i) <= INFO_MODE_LEVELSET ? (i) : \
+ INFO_MODE_MAIN)
+
+#define DRAW_XOFFSET_INFO(i) (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ? \
+ menu.draw_xoffset[GAME_MODE_INFO] : \
+ menu.draw_xoffset_info[DRAW_MODE_INFO(i)])
+#define DRAW_YOFFSET_INFO(i) (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ? \
+ menu.draw_yoffset[GAME_MODE_INFO] : \
+ menu.draw_yoffset_info[DRAW_MODE_INFO(i)])
+
+#define DRAW_XOFFSET(s) ((s) == GAME_MODE_INFO ? \
+ DRAW_XOFFSET_INFO(info_mode) : \
+ menu.draw_xoffset[DRAW_MODE(s)])
+#define DRAW_YOFFSET(s) ((s) == GAME_MODE_INFO ? \
+ DRAW_YOFFSET_INFO(info_mode) : \
+ menu.draw_yoffset[DRAW_MODE(s)])
+
+#define mSX (SX + DRAW_XOFFSET(game_status))
+#define mSY (SY + DRAW_YOFFSET(game_status))
#define NUM_MENU_ENTRIES_ON_SCREEN (menu.list_size[game_status] > 2 ? \
menu.list_size[game_status] : \
#define MAIN_CONTROL_CURRENT_LEVEL 10
#define MAIN_CONTROL_FIRST_LEVEL 11
#define MAIN_CONTROL_LAST_LEVEL 12
-#define MAIN_CONTROL_LEVELSET_INFO 13
-#define MAIN_CONTROL_LEVEL_INFO 14
+#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];
{
int nr;
- struct Rect *pos_button;
+ struct MenuPosInfo *pos_button;
int button_graphic;
- struct Rect *pos_text;
+ struct MenuPosInfo *pos_text;
char *text;
int font_text;
- struct Rect *pos_input;
+ struct MenuPosInfo *pos_input;
char *input;
int font_input;
}
NULL, NULL, -1,
},
{
- MAIN_CONTROL_LEVELSET_INFO,
+ MAIN_CONTROL_LEVEL_INFO_1,
+ NULL, -1,
+ &menu.main.text.level_info_1, NULL, -1,
+ NULL, NULL, -1,
+ },
+ {
+ MAIN_CONTROL_LEVEL_INFO_2,
+ NULL, -1,
+ &menu.main.text.level_info_2, NULL, -1,
+ NULL, NULL, -1,
+ },
+ {
+ MAIN_CONTROL_TITLE_1,
+ NULL, -1,
+ &menu.main.text.title_1, PROGRAM_TITLE_STRING, FONT_TITLE_1,
+ NULL, NULL, -1,
+ },
+ {
+ MAIN_CONTROL_TITLE_2,
NULL, -1,
- &menu.main.text.levelset_info, NULL, -1,
+ &menu.main.text.title_2, PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2,
NULL, NULL, -1,
},
{
- MAIN_CONTROL_LEVEL_INFO,
+ MAIN_CONTROL_TITLE_3,
NULL, -1,
- &menu.main.text.level_info, NULL, -1,
+ &menu.main.text.title_3, PROGRAM_GAME_BY_STRING, FONT_TITLE_2,
NULL, NULL, -1,
},
/* 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 Rect *pos_button = main_controls[i].pos_button;
- struct Rect *pos_text = main_controls[i].pos_text;
- struct Rect *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;
+ 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;
int font_text_width = (font_text != -1 ? getFontWidth(font_text) : 0);
int font_text_height = (font_text != -1 ? getFontHeight(font_text) : 0);
if (pos_text != NULL)
{
+ /* 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 (pos_text->width == -1)
+ if (pos_text->width == -1 || calculate_text_width)
pos_text->width = text_width;
if (pos_text->height == -1)
pos_text->height = text_height;
for (i = 0; main_controls[i].nr != -1; i++)
{
- if (main_controls[i].nr == pos)
+ if (main_controls[i].nr == pos || pos == -1)
{
- struct Rect *pos_button = main_controls[i].pos_button;
- struct Rect *pos_text = main_controls[i].pos_text;
- char *text = main_controls[i].text;
- int font_text = main_controls[i].font_text;
- int button_graphic = main_controls[i].button_graphic;
- int button_x = mSX + pos_button->x;
- int button_y = mSY + pos_button->y;
- int text_x = mSX + pos_text->x;
- int text_y = mSY + pos_text->y;
+ 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;
if (active)
{
font_text = FONT_ACTIVE(font_text);
}
- DrawBackground(button_x, button_y, pos_button->width, pos_button->height);
- DrawGraphicThruMaskExt(drawto, button_x, button_y, button_graphic, 0);
+ if (pos_button != NULL)
+ {
+ int button_x = mSX + pos_button->x;
+ int button_y = mSY + pos_button->y;
- DrawBackground(text_x, text_y, pos_text->width, pos_text->height);
- DrawText(text_x, text_y, text, font_text);
+ DrawBackground(button_x,button_y, pos_button->width,pos_button->height);
+ DrawGraphicThruMaskExt(drawto, button_x, button_y, button_graphic, 0);
+ }
- break;
+ if (pos_text != NULL && text != NULL)
+ {
+ int text_x = mSX + ALIGNED_XPOS(pos_text->x, pos_text->width,
+ pos_text->align);
+ int text_y = mSY + pos_text->y;
+
+ DrawBackground(text_x, text_y, pos_text->width, pos_text->height);
+ DrawText(text_x, text_y, text, font_text);
+ }
+
+ if (pos_input != NULL && input != NULL)
+ {
+ int input_x = mSX + ALIGNED_XPOS(pos_input->x, pos_input->width,
+ pos_input->align);
+ int input_y = mSY + pos_input->y;
+
+ DrawBackground(input_x, input_y, pos_input->width, pos_input->height);
+ DrawText(input_x, input_y, input, font_input);
+ }
}
}
}
-static boolean insideRect(struct Rect *rect, int x, int y)
+static boolean insideMenuPosRect(struct MenuPosInfo *rect, int x, int y)
{
- return (rect != NULL &&
- 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_XPOS(rect->x, rect->width, rect->align);
+ int rect_y = rect->y;
+
+ return (x >= rect_x && x < rect_x + rect->width &&
+ y >= rect_y && y < rect_y + rect->height);
}
static void drawCursorExt(int xpos, int ypos, boolean active, int graphic)
/* force LEVELS draw offset on artwork setup screen */
game_status = GAME_MODE_LEVELS;
- drawCursorExt(0, ypos, active, 0);
+ drawCursorExt(0, ypos, active, -1);
game_status = last_game_status; /* restore current game status */
}
}
#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()
char *name_text = (local_team_mode ? "Team:" : "Name:");
int name_width, level_width;
#endif
+#if 0
int i;
+#endif
UnmapAllGadgets();
FadeSoundsAndMusic();
#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;
SetMainBackgroundImage(IMG_BACKGROUND_MAIN);
ClearWindow();
- DrawHeadline();
-
#if 1
InitializeMainControls();
+#if 1
+ DrawCursorAndText_Main(-1, FALSE);
+#else
for (i = 0; main_controls[i].nr != -1; i++)
{
- struct Rect *pos_button = main_controls[i].pos_button;
- struct Rect *pos_text = main_controls[i].pos_text;
- struct Rect *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 = 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;
if (pos_button != NULL)
DrawGraphicThruMaskExt(drawto, mSX + pos_button->x, mSY + pos_button->y,
if (pos_input != NULL && input != NULL)
DrawText(mSX + pos_input->x, mSY + pos_input->y, input, font_input);
}
+#endif
#else
+ DrawHeadline();
+
DrawText(mSX + 32, mSY + 2 * 32, name_text, FONT_MENU_1);
DrawText(mSX + 32, mSY + 3 * 32, "Levelset", FONT_MENU_1);
DrawText(mSX + 32, mSY + 4 * 32, "Hall Of Fame", FONT_MENU_1);
for (i = 0; i < 8; i++)
initCursor(i, (i == 1 || i == 4 || i == 6 ? IMG_MENU_BUTTON_ENTER_MENU :
IMG_MENU_BUTTON));
+
+ DrawTextSCentered(326, FONT_TITLE_2, PROGRAM_GAME_BY_STRING);
#endif
DrawPreviewLevel(TRUE);
- DrawTextSCentered(326, FONT_TITLE_2, "A Game by Artsoft Entertainment");
-
HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE);
TapeStop();
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)
for (i = 0; main_controls[i].nr != -1; i++)
{
- if (insideRect(main_controls[i].pos_button, mx - mSX, my - mSY) ||
- insideRect(main_controls[i].pos_text, mx - mSX, my - mSY) ||
- insideRect(main_controls[i].pos_input, mx - mSX, my - mSY))
+ if (insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY) ||
+ insideMenuPosRect(main_controls[i].pos_text, mx - mSX, my - mSY) ||
+ insideMenuPosRect(main_controls[i].pos_input, mx - mSX, my - mSY))
{
pos = main_controls[i].nr;
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);
drawChooseTreeList(ti->cl_first, num_page_entries, ti);
drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
- drawChooseTreeCursor(ti->cl_cursor, FC_RED);
+ drawChooseTreeCursor(ti->cl_cursor, TRUE);
return;
}
drawChooseTreeList(ti->cl_first, num_page_entries, ti);
drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
- drawChooseTreeCursor(ti->cl_cursor, FC_RED);
+ drawChooseTreeCursor(ti->cl_cursor, TRUE);
+
AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
ti->cl_first, ti);
}
drawChooseTreeList(ti->cl_first, num_page_entries, ti);
drawChooseTreeInfo(ti->cl_first + ti->cl_cursor, ti);
- drawChooseTreeCursor(ti->cl_cursor, FC_RED);
+ drawChooseTreeCursor(ti->cl_cursor, TRUE);
+
AdjustChooseTreeScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
ti->cl_first, ti);
}
{
if (y != ti->cl_cursor)
{
- drawChooseTreeCursor(y, FC_RED);
- drawChooseTreeCursor(ti->cl_cursor, FC_BLUE);
+ drawChooseTreeCursor(ti->cl_cursor, FALSE);
+ drawChooseTreeCursor(y, TRUE);
drawChooseTreeInfo(ti->cl_first + y, ti);
+
ti->cl_cursor = y;
}
}
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)
PlayMenuMusic();
}
+void RedrawSetupScreenAfterFullscreenToggle()
+{
+ if (setup_mode == SETUP_MODE_GRAPHICS)
+ DrawSetupScreen();
+}
+
void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
{
if (setup_mode == SETUP_MODE_INPUT)
GDI_SCROLLBAR_ITEMS_MAX, items_max,
GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
GDI_SCROLLBAR_ITEM_POSITION, item_position,
+#if 1
+ GDI_WHEEL_AREA_X, SX,
+ GDI_WHEEL_AREA_Y, SY,
+ GDI_WHEEL_AREA_WIDTH, SXSIZE,
+ GDI_WHEEL_AREA_HEIGHT, SYSIZE,
+#else
GDI_WHEEL_AREA_X, 0,
GDI_WHEEL_AREA_Y, 0,
GDI_WHEEL_AREA_WIDTH, WIN_XSIZE,
GDI_WHEEL_AREA_HEIGHT, WIN_YSIZE,
+#endif
GDI_STATE, GD_BUTTON_UNPRESSED,
GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1,
GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2,