#include "cartoons.h"
#include "network.h"
#include "init.h"
+#include "config.h"
/* screens in the setup menu */
#define SETUP_MODE_MAIN 0
#define INFO_MODE_MUSIC 3
#define INFO_MODE_CREDITS 4
#define INFO_MODE_PROGRAM 5
-#define INFO_MODE_LEVELSET 6
+#define INFO_MODE_VERSION 6
+#define INFO_MODE_LEVELSET 7
-#define MAX_INFO_MODES 7
+#define MAX_INFO_MODES 8
/* for various menu stuff */
#define MENU_SCREEN_START_XPOS 1
static void HandleInfoScreen_Music(int);
static void HandleInfoScreen_Credits(int);
static void HandleInfoScreen_Program(int);
+static void HandleInfoScreen_Version(int);
static void MapScreenMenuGadgets(int);
static void MapScreenTreeGadgets(TreeInfo *);
}
}
-static void DrawCursorAndText_Main(int nr, boolean active)
+static void DrawCursorAndText_Main_Ext(int nr, boolean active_text,
+ boolean active_input)
{
int i;
int font_text = mci->font_text;
int font_input = mci->font_input;
- if (active)
+ if (active_text)
{
button_graphic = BUTTON_GRAPHIC_ACTIVE(button_graphic);
font_text = FONT_ACTIVE(font_text);
}
+ if (active_input)
+ {
+ font_input = FONT_ACTIVE(font_input);
+ }
+
if (pos_button != NULL)
{
struct MenuPosInfo *pos = pos_button;
if (pos_text != NULL && text != NULL)
{
struct MenuPosInfo *pos = pos_text;
- int x = mSX + ALIGNED_XPOS(pos->x, pos->width, pos->align);
- int y = mSY + pos->y;
+ int x = mSX + ALIGNED_MENU_XPOS(pos);
+ int y = mSY + ALIGNED_MENU_YPOS(pos);
DrawBackgroundForFont(x, y, pos->width, pos->height, font_text);
DrawText(x, y, text, font_text);
if (pos_input != NULL && input != NULL)
{
struct MenuPosInfo *pos = pos_input;
- int x = mSX + ALIGNED_XPOS(pos->x, pos->width, pos->align);
- int y = mSY + pos->y;
+ int x = mSX + ALIGNED_MENU_XPOS(pos);
+ int y = mSY + ALIGNED_MENU_YPOS(pos);
DrawBackgroundForFont(x, y, pos->width, pos->height, font_input);
DrawText(x, y, input, font_input);
}
}
+static void DrawCursorAndText_Main(int nr, boolean active_text)
+{
+ DrawCursorAndText_Main_Ext(nr, active_text, FALSE);
+}
+
+#if 0
+static void DrawCursorAndText_Main_Input(int nr, boolean active_text)
+{
+ DrawCursorAndText_Main_Ext(nr, active_text, TRUE);
+}
+#endif
+
static struct MainControlInfo *getMainControlInfo(int nr)
{
int i;
if (rect == NULL)
return FALSE;
- int rect_x = ALIGNED_XPOS(rect->x, rect->width, rect->align);
- int rect_y = rect->y;
+ int rect_x = ALIGNED_MENU_XPOS(rect);
+ int rect_y = ALIGNED_MENU_YPOS(rect);
return (x >= rect_x && x < rect_x + rect->width &&
y >= rect_y && y < rect_y + rect->height);
IMG_TITLESCREEN_1);
}
+int effectiveGameStatus()
+{
+ if (game_status == GAME_MODE_INFO && info_mode == INFO_MODE_TITLE)
+ return GAME_MODE_TITLE;
+
+ return game_status;
+}
+
void DrawTitleScreenImage(int nr)
{
int graphic = getTitleScreenGraphic() + nr;
title.auto_delay_final = graphic_info[graphic].auto_delay;
}
+void DrawTitleScreenMessage(char *filename)
+{
+ int font_nr = FONT_TEXT_1;
+ int font_width;
+ int font_height;
+ int pad_x = 16;
+ int pad_y = 32;
+ int sx = pad_x;
+ int sy = pad_y;
+ int max_chars_per_line;
+ int max_lines_per_screen;
+ int last_game_status = game_status; /* save current game status */
+
+ if (filename == NULL)
+ return;
+
+ SetDrawBackgroundMask(REDRAW_ALL);
+ SetWindowBackgroundImageIfDefined(IMG_BACKGROUND_MESSAGE);
+
+ ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
+
+ /* force MESSAGE font on title message screen */
+ game_status = GAME_MODE_MESSAGE;
+
+ 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;
+
+ DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line,
+ max_lines_per_screen, FALSE);
+
+ game_status = last_game_status; /* restore current game status */
+}
+
void DrawTitleScreen()
{
KeyboardAutoRepeatOff();
/* needed if last screen (level choice) changed graphics, sounds or music */
ReloadCustomArtwork(0);
-#ifdef TARGET_SDL
+#if defined(TARGET_SDL)
SetDrawtoField(DRAW_BACKBUFFER);
#endif
if (setup.show_titlescreen &&
((levelset_has_changed &&
- graphic_info[IMG_TITLESCREEN_1].bitmap != NULL) ||
+ (graphic_info[IMG_TITLESCREEN_1].bitmap != NULL ||
+ getLevelSetMessageFilename() != NULL)) ||
(show_titlescreen_initial &&
graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL)))
{
{
static unsigned long title_delay = 0;
static int title_nr = 0;
+ static boolean showing_message = FALSE;
+ char *filename = getLevelSetMessageFilename();
boolean return_to_main_menu = FALSE;
boolean use_fading_main_menu = TRUE;
boolean use_cross_fading = !show_titlescreen_initial; /* default */
+ boolean no_title_info = (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL &&
+ filename == NULL);
if (button == MB_MENU_INITIALIZE)
{
title_delay = 0;
title_nr = 0;
+ showing_message = FALSE;
if (show_titlescreen_initial &&
graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap == NULL)
if (game_status == GAME_MODE_INFO)
{
- if (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL)
+ if (no_title_info)
{
DrawInfoScreen_NotAvailable("Title screen information:",
"No title screen for this level set.");
+ title.auto_delay_final = -1;
+
return;
}
game_status = last_game_status; /* restore current game status */
- DrawTitleScreenImage(title_nr);
+ if (graphic_info[getTitleScreenGraphic()].bitmap != NULL)
+ {
+ DrawTitleScreenImage(title_nr);
+ }
+ else
+ {
+ DrawTitleScreenMessage(filename);
+
+ showing_message = TRUE;
+
+ title.fade_delay_final = title.fade_delay;
+ title.post_delay_final = title.post_delay;
+ title.auto_delay_final = -1;
+ }
FadeIn(REDRAW_ALL);
{
int anim_mode;
- if (game_status == GAME_MODE_INFO &&
- graphic_info[IMG_TITLESCREEN_1].bitmap == NULL)
+ if (game_status == GAME_MODE_INFO && no_title_info)
{
+ FadeOut(REDRAW_FIELD);
+
info_mode = INFO_MODE_MAIN;
- DrawInfoScreen();
+ DrawAndFadeInInfoScreen(REDRAW_FIELD);
return;
}
DelayReached(&title_delay, 0); /* reset delay counter */
}
+ else if (!showing_message && filename != NULL)
+ {
+ if (use_cross_fading)
+ FadeCrossSaveBackbuffer();
+
+ DrawTitleScreenMessage(filename);
+
+ if (use_cross_fading)
+ FadeCross(REDRAW_ALL);
+ else
+ FadeIn(REDRAW_ALL);
+
+ DelayReached(&title_delay, 0); /* reset delay counter */
+
+ showing_message = TRUE;
+ }
else
{
FadeSoundsAndMusic();
{
struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_CURRENT_LEVEL);
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
level_nr = new_level_nr;
#if 1
{
if (pos != choice)
{
+ PlaySound(SND_MENU_ITEM_ACTIVATING);
+
DrawCursorAndText_Main(choice, FALSE);
DrawCursorAndText_Main(pos, TRUE);
}
else
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
if (pos == MAIN_CONTROL_NAME)
{
game_status = GAME_MODE_PSEUDO_TYPENAME;
DrawInfoScreen();
}
+static void execInfoVersion()
+{
+ info_mode = INFO_MODE_VERSION;
+ DrawInfoScreen();
+}
+
static void execInfoLevelSet()
{
info_mode = INFO_MODE_LEVELSET;
{ TYPE_ENTER_SCREEN, execInfoMusic, "Music Info" },
{ TYPE_ENTER_SCREEN, execInfoCredits, "Credits" },
{ TYPE_ENTER_SCREEN, execInfoProgram, "Program Info" },
+ { TYPE_ENTER_SCREEN, execInfoVersion, "Version Info" },
{ TYPE_ENTER_SCREEN, execInfoLevelSet, "Level Set Info" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execExitInfo, "Exit" },
{
if (y != choice)
{
+ PlaySound(SND_MENU_ITEM_ACTIVATING);
+
#if 1
DrawCursorAndText_Info(choice, FALSE);
DrawCursorAndText_Info(y, TRUE);
}
else if (!(info_info[y].type & TYPE_GHOSTED))
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
if (info_info[y].type & TYPE_ENTER_OR_LEAVE)
{
void (*menu_callback_function)(void) = info_info[choice].value;
void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
{
- int ystart = 150;
+ int ystart1 = 100;
+ int ystart2 = 150;
int ybottom = SYSIZE - 20;
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
+ FadeOut(REDRAW_FIELD);
+
ClearWindow();
DrawHeadline();
- DrawTextSCentered(100, FONT_TEXT_1, text_title);
+ DrawTextSCentered(ystart1, FONT_TEXT_1, text_title);
+ DrawTextSCentered(ystart2, FONT_TEXT_2, text_error);
DrawTextSCentered(ybottom, FONT_TEXT_4,
"Press any key or button for info menu");
- DrawTextSCentered(ystart, FONT_TEXT_2, text_error);
+ FadeIn(REDRAW_FIELD);
}
void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
{
+#if 1
+ int font_nr = FONT_INFO_ELEMENTS;
+#else
int font_nr = FONT_LEVEL_NUMBER;
+#endif
int font_width = getFontWidth(font_nr);
int sx = mSX + MINI_TILEX + TILEX + MINI_TILEX;
int sy = mSY + 65 + 2 * 32 + 1;
if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE)
{
if (button != MB_MENU_INITIALIZE)
+ {
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
page++;
+ }
if (page >= num_pages)
{
if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
+ FadeSoundsAndMusic();
+
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
int y = 0;
if (button != MB_MENU_INITIALIZE)
+ {
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
if (list != NULL)
list = list->next;
+ }
if (list == NULL)
{
}
else if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
{
boolean show_screen;
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
screen_nr++;
FadeCrossSaveBackbuffer();
{
if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawInfoScreen();
+
+ return;
+ }
+ else if (button == MB_MENU_CHOICE)
+ {
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
+ FadeSoundsAndMusic();
+ FadeOut(REDRAW_FIELD);
+
+ info_mode = INFO_MODE_MAIN;
+ DrawAndFadeInInfoScreen(REDRAW_FIELD);
+ }
+ else
+ {
+ PlayMenuSoundIfLoop();
+ }
+}
+
+void DrawInfoScreen_Version()
+{
+ int font_header = FONT_TEXT_3;
+ int font_text = FONT_TEXT_2;
+ int xstep = getFontWidth(font_text);
+ int ystep = getFontHeight(font_text);
+ int xstart1 = SX + 2 * xstep;
+ int xstart2 = SX + 18 * xstep;
+ int xstart3 = SX + 28 * xstep;
+ int ystart = 150;
+ int ybottom = SYSIZE - 20;
+#if defined(TARGET_SDL)
+ SDL_version sdl_version_compiled;
+ const SDL_version *sdl_version_linked;
+#endif
+
+ SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM);
+
+ FadeOut(REDRAW_FIELD);
+
+ ClearWindow();
+ DrawHeadline();
+
+ DrawTextSCentered(100, FONT_TEXT_1, "Version Information:");
+
+ DrawTextF(xstart1, ystart, font_header, "Name");
+ DrawTextF(xstart2, ystart, font_text, PROGRAM_TITLE_STRING);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Version");
+ DrawTextF(xstart2, ystart, font_text, getProgramFullVersionString());
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Platform");
+ DrawTextF(xstart2, ystart, font_text, PLATFORM_STRING);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Target");
+ DrawTextF(xstart2, ystart, font_text, TARGET_STRING);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_header, "Compile time");
+ DrawTextF(xstart2, ystart, 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");
+
+ 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",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+
+ SDL_IMAGE_VERSION(&sdl_version_compiled);
+#if 0
+ sdl_version_linked = IMG_Linked_Version();
+#else
+#endif
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_text, "SDL_image");
+ DrawTextF(xstart2, ystart, font_text, "%d.%d.%d",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+#if 0
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+#else
+ DrawTextF(xstart3, ystart, font_text, "?.?.?");
+#endif
+
+ 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",
+ sdl_version_compiled.major,
+ sdl_version_compiled.minor,
+ sdl_version_compiled.patch);
+ DrawTextF(xstart3, ystart, font_text, "%d.%d.%d",
+ sdl_version_linked->major,
+ sdl_version_linked->minor,
+ sdl_version_linked->patch);
+
+ ystart += ystep;
+ DrawTextF(xstart1, ystart, font_text, "SDL_net");
+ DrawTextF(xstart2, ystart, font_text, "?.?.?");
+ DrawTextF(xstart3, ystart, font_text, "?.?.?");
+#endif
+
+ DrawTextSCentered(ybottom, FONT_TEXT_4,
+ "Press any key or button for info menu");
+
+ FadeIn(REDRAW_FIELD);
+}
+
+void HandleInfoScreen_Version(int button)
+{
+ if (button == MB_MENU_LEAVE)
+ {
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
}
else if (button == MB_MENU_CHOICE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
FadeSoundsAndMusic();
FadeOut(REDRAW_FIELD);
int ystart = 150;
int ybottom = SYSIZE - 20;
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;
if (filename != NULL)
DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line,
- max_lines_per_screen);
+ max_lines_per_screen, TRUE);
else
DrawTextSCentered(ystart, FONT_TEXT_2,
"No information for this level set.");
{
if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
}
else if (button == MB_MENU_CHOICE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
FadeSoundsAndMusic();
FadeOut(REDRAW_FIELD);
DrawInfoScreen_Credits();
else if (info_mode == INFO_MODE_PROGRAM)
DrawInfoScreen_Program();
+ else if (info_mode == INFO_MODE_VERSION)
+ DrawInfoScreen_Version();
else if (info_mode == INFO_MODE_LEVELSET)
DrawInfoScreen_LevelSet();
else
HandleInfoScreen_Credits(button);
else if (info_mode == INFO_MODE_PROGRAM)
HandleInfoScreen_Program(button);
+ else if (info_mode == INFO_MODE_VERSION)
+ HandleInfoScreen_Version(button);
else if (info_mode == INFO_MODE_LEVELSET)
HandleInfoScreen_LevelSet(button);
else
void HandleTypeName(int newxpos, Key key)
{
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);
+#endif
#if 1
static int xpos = 0;
#else
int font_active_nr = FONT_ACTIVE(font_nr);
int font_width = getFontWidth(font_active_nr);
#if 1
+#if 0
int startx = mSX + mci->pos_input->x;
int starty = mSY + mci->pos_input->y;
+#endif
#else
int name_width = getFontWidth(FONT_MENU_1) * strlen("Name:");
int startx = mSX + 32 + name_width;
/* force LEVELS font on artwork setup screen */
game_status = GAME_MODE_LEVELS;
+#if 1
+ /* clear tree list area, but not title or scrollbar */
+ DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
+ SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset,
+ NUM_MENU_ENTRIES_ON_SCREEN * 32);
+#else
/* clear tree list area, but not title or scrollbar */
DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset,
MAX_MENU_ENTRIES_ON_SCREEN * 32);
+#endif
for (i = 0; i < num_page_entries; i++)
{
}
else if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
if (ti->node_parent)
{
*ti_ptr = ti->node_parent;
if (node_cursor->node_group)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
node_cursor->cl_first = ti->cl_first;
node_cursor->cl_cursor = ti->cl_cursor;
*ti_ptr = node_cursor->node_group;
}
else if (dx == -1 && ti->node_parent)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
*ti_ptr = ti->node_parent;
DrawChooseTree(ti_ptr);
{
if (y != ti->cl_cursor)
{
+ PlaySound(SND_MENU_ITEM_ACTIVATING);
+
drawChooseTreeCursor(ti->cl_cursor, FALSE);
drawChooseTreeCursor(y, TRUE);
drawChooseTreeInfo(ti->cl_first + y, ti);
TreeInfo *node_first, *node_cursor;
int entry_pos = ti->cl_first + y;
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
node_first = getTreeInfoFirstGroupEntry(ti);
node_cursor = getTreeInfoFromPos(node_first, entry_pos);
}
else if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
FadeSound(SND_BACKGROUND_SCORES);
game_status = GAME_MODE_MAIN;
}
else if (button == MB_MENU_CHOICE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
FadeSound(SND_BACKGROUND_SCORES);
FadeOut(REDRAW_FIELD);
{ TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX-Boulderdash:" },
#endif
{ TYPE_SWITCH, &setup.editor.el_chars, "Text Characters:" },
+ { TYPE_SWITCH, &setup.editor.el_steel_chars, "Text Characters (Steel):" },
{ TYPE_SWITCH, &setup.editor.el_custom, "Custom & Group Elements:" },
#if 0
{ TYPE_SWITCH, &setup.editor.el_headlines, "Headlines:" },
}
else if (button == MB_MENU_LEAVE)
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
for (y = 0; y < num_setup_info; y++)
{
if (setup_info[y].type & TYPE_LEAVE_MENU)
{
if (y != choice && setup_info[y].type & ~TYPE_SKIP_ENTRY)
{
+ PlaySound(SND_MENU_ITEM_ACTIVATING);
+
#if 1
DrawCursorAndText_Setup(choice, FALSE);
DrawCursorAndText_Setup(y, TRUE);
}
else if (!(setup_info[y].type & TYPE_GHOSTED))
{
+ PlaySound(SND_MENU_ITEM_SELECTING);
+
/* when selecting key headline, execute function for key value change */
if (setup_info[y].type & TYPE_KEYTEXT &&
setup_info[y + 1].type & TYPE_KEY)