#define SETUP_MODE_GAME 1
#define SETUP_MODE_EDITOR 2
#define SETUP_MODE_INPUT 3
-#define SETUP_MODE_SHORTCUT 4
-#define SETUP_MODE_GRAPHICS 5
-#define SETUP_MODE_SOUND 6
-#define SETUP_MODE_ARTWORK 7
-#define SETUP_MODE_CHOOSE_GRAPHICS 8
-#define SETUP_MODE_CHOOSE_SOUNDS 9
-#define SETUP_MODE_CHOOSE_MUSIC 10
+#define SETUP_MODE_SHORTCUT_1 4
+#define SETUP_MODE_SHORTCUT_2 5
+#define SETUP_MODE_GRAPHICS 6
+#define SETUP_MODE_SOUND 7
+#define SETUP_MODE_ARTWORK 8
+#define SETUP_MODE_CHOOSE_GRAPHICS 9
+#define SETUP_MODE_CHOOSE_SOUNDS 10
+#define SETUP_MODE_CHOOSE_MUSIC 11
-#define MAX_SETUP_MODES 11
+#define MAX_SETUP_MODES 12
/* for input setup functions */
#define SETUPINPUT_SCREEN_POS_START 0
/* screens on the info screen */
#define INFO_MODE_MAIN 0
-#define INFO_MODE_ELEMENTS 1
-#define INFO_MODE_MUSIC 2
-#define INFO_MODE_CREDITS 3
-#define INFO_MODE_PROGRAM 4
-#define INFO_MODE_LEVELSET 5
+#define INFO_MODE_TITLE 1
+#define INFO_MODE_ELEMENTS 2
+#define INFO_MODE_MUSIC 3
+#define INFO_MODE_CREDITS 4
+#define INFO_MODE_PROGRAM 5
+#define INFO_MODE_LEVELSET 6
-#define MAX_INFO_MODES 6
+#define MAX_INFO_MODES 7
/* for various menu stuff */
-#define MAX_INFO_ELEMENTS_ON_SCREEN 10
-#define MAX_MENU_ENTRIES_ON_SCREEN (SCR_FIELDY - 2)
+#define MENU_SCREEN_START_XPOS 1
#define MENU_SCREEN_START_YPOS 2
#define MENU_SCREEN_VALUE_XPOS 14
+#define MENU_SCREEN_MAX_XPOS (SCR_FIELDX - 1)
#define MENU_TITLE1_YPOS 8
#define MENU_TITLE2_YPOS 46
+#define MAX_INFO_ELEMENTS_ON_SCREEN 10
+#define MAX_MENU_ENTRIES_ON_SCREEN (SCR_FIELDY - MENU_SCREEN_START_YPOS)
+#define MAX_MENU_TEXT_LENGTH_BIG (MENU_SCREEN_VALUE_XPOS - \
+ MENU_SCREEN_START_XPOS)
+#define MAX_MENU_TEXT_LENGTH_MEDIUM (MAX_MENU_TEXT_LENGTH_BIG * 2)
/* buttons and scrollbars identifiers */
#define SCREEN_CTRL_ID_SCROLL_UP 0
#define NUM_SCREEN_SCROLLBARS 1
#define NUM_SCREEN_GADGETS 3
+/* graphic position and size values for buttons and scrollbars */
+#define SC_SCROLLBUTTON_XSIZE TILEX
+#define SC_SCROLLBUTTON_YSIZE TILEY
+
+#define SC_SCROLLBAR_XPOS (SXSIZE - SC_SCROLLBUTTON_XSIZE)
+
+#define SC_SCROLL_VERTICAL_XSIZE SC_SCROLLBUTTON_XSIZE
+#define SC_SCROLL_VERTICAL_YSIZE ((MAX_MENU_ENTRIES_ON_SCREEN - 2) * \
+ SC_SCROLLBUTTON_YSIZE)
+
+#define SC_SCROLL_UP_XPOS SC_SCROLLBAR_XPOS
+#define SC_SCROLL_UP_YPOS (2 * SC_SCROLLBUTTON_YSIZE)
+
+#define SC_SCROLL_VERTICAL_XPOS SC_SCROLLBAR_XPOS
+#define SC_SCROLL_VERTICAL_YPOS (SC_SCROLL_UP_YPOS + \
+ SC_SCROLLBUTTON_YSIZE)
+
+#define SC_SCROLL_DOWN_XPOS SC_SCROLLBAR_XPOS
+#define SC_SCROLL_DOWN_YPOS (SC_SCROLL_VERTICAL_YPOS + \
+ SC_SCROLL_VERTICAL_YSIZE)
+
+#define SC_BORDER_SIZE 14
+
+
/* forward declarations of internal functions */
static void HandleScreenGadgets(struct GadgetInfo *);
static void HandleSetupScreen_Generic(int, int, int, int, int);
static void DrawInfoScreen(void);
static void DrawSetupScreen(void);
+static void DrawInfoScreenExt(int);
+static void DrawInfoScreen_NotAvailable(char *, char *);
static void DrawInfoScreen_HelpAnim(int, int, boolean);
static void DrawInfoScreen_HelpText(int, int, int, int);
static void HandleInfoScreen_Main(int, int, int, int, int);
+static void HandleInfoScreen_TitleScreen(int);
static void HandleInfoScreen_Elements(int);
static void HandleInfoScreen_Music(int);
static void HandleInfoScreen_Credits(int);
g == IMG_MENU_BUTTON_RIGHT ? IMG_MENU_BUTTON_RIGHT_ACTIVE :
g == IMG_MENU_BUTTON_LEAVE_MENU ? IMG_MENU_BUTTON_LEAVE_MENU_ACTIVE :
g == IMG_MENU_BUTTON_ENTER_MENU ? IMG_MENU_BUTTON_ENTER_MENU_ACTIVE :
+ g == IMG_MENU_BUTTON_LAST_LEVEL ? IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE :
+ g == IMG_MENU_BUTTON_NEXT_LEVEL ? IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE :
IMG_MENU_BUTTON_ACTIVE);
ypos += MENU_SCREEN_START_YPOS;
game_status = last_game_status; /* restore current game status */
}
-static void PlayMenuSound()
-{
- int sound = menu.sound[game_status];
-
- if (sound == SND_UNDEFINED)
- return;
-
- if (sound_info[sound].loop)
- PlaySoundLoop(sound);
- else
- PlaySound(sound);
-}
-
-static void PlayMenuSoundIfLoop()
-{
- int sound = menu.sound[game_status];
-
- if (sound == SND_UNDEFINED)
- return;
-
- if (sound_info[sound].loop)
- PlaySoundLoop(sound);
-}
-
-static void PlayMenuMusic()
-{
- int music = menu.music[game_status];
-
- if (music == MUS_UNDEFINED)
- return;
-
- PlayMusic(music);
-}
-
void DrawHeadline()
{
DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, PROGRAM_TITLE_STRING);
}
}
-void DrawMainMenu()
+static int getLastLevelButtonPos()
+{
+ return 10;
+}
+
+static int getCurrentLevelTextPos()
+{
+ return (getLastLevelButtonPos() + 1);
+}
+
+static int getNextLevelButtonPos()
+{
+ return getLastLevelButtonPos() + 3 + 1;
+}
+
+static int getLevelRangeTextPos()
+{
+ return getNextLevelButtonPos() + 1;
+}
+
+void DrawTitleScreenImage(int nr)
+{
+ int graphic = IMG_TITLESCREEN_1 + nr;
+ Bitmap *bitmap = graphic_info[graphic].bitmap;
+ int width = graphic_info[graphic].src_image_width;
+ int height = graphic_info[graphic].src_image_height;
+ int src_x = 0, src_y = 0;
+ int dst_x, dst_y;
+
+ if (bitmap == NULL)
+ return;
+
+ if (width > WIN_XSIZE)
+ {
+ /* image width too large for window => center image horizontally */
+ src_x = (width - WIN_XSIZE) / 2;
+ width = WIN_XSIZE;
+ }
+
+ if (height > WIN_YSIZE)
+ {
+ /* image height too large for window => center image vertically */
+ src_y = (height - WIN_YSIZE) / 2;
+ height = WIN_YSIZE;
+ }
+
+ dst_x = (WIN_XSIZE - width) / 2;
+ dst_y = (WIN_YSIZE - height) / 2;
+
+ ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
+
+ if (DrawingOnBackground(dst_x, dst_y))
+ BlitBitmapMasked(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
+ else
+ BlitBitmap(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
+
+ redraw_mask = REDRAW_ALL;
+}
+
+void DrawTitleScreen()
+{
+ KeyboardAutoRepeatOff();
+
+ SetMainBackgroundImage(IMG_BACKGROUND_TITLE);
+
+ HandleTitleScreen(0, 0, 0, 0, MB_MENU_INITIALIZE);
+
+ StopAnimation();
+}
+
+static void DrawMainMenuExt(int fade_delay)
{
static LevelDirTree *leveldir_last_valid = NULL;
+ boolean levelset_has_changed = FALSE;
char *name_text = (!options.network && setup.team_mode ? "Team:" : "Name:");
#if 1
char *level_text = "Levelset";
audio.sound_deactivated = FALSE;
+#if 1
+ GetPlayerConfig();
+#endif
+
/* needed if last screen was the playing screen, invoked from level editor */
if (level_editor_test_game)
{
if (!validLevelSeries(leveldir_current))
leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
+ if (leveldir_current != leveldir_last_valid)
+ levelset_has_changed = TRUE;
+
/* store valid level series information */
leveldir_last_valid = leveldir_current;
SetDrawtoField(DRAW_BACKBUFFER);
#endif
+ if (setup.show_titlescreen &&
+ levelset_has_changed &&
+ graphic_info[IMG_TITLESCREEN_1].bitmap != NULL)
+ {
+ game_status = GAME_MODE_TITLE;
+ DrawTitleScreen();
+
+ return;
+ }
+
+#if 0
/* map gadgets for main menu screen */
MapTapeButtons();
+#endif
/* level_nr may have been set to value over handicap with level editor */
if (setup.handicap && level_nr > leveldir_current->handicap_level)
level_nr = leveldir_current->handicap_level;
+#if 0
GetPlayerConfig();
+#endif
LoadLevel(level_nr);
SetMainBackgroundImage(IMG_BACKGROUND_MAIN);
/* calculated after (possible) reload of custom artwork */
name_width = getTextWidth(name_text, FONT_MENU_1);
+#if 1
+ level_width = 9 * 32;
+#else
#if 1
level_width = 9 * getFontWidth(FONT_MENU_1);
#else
level_width = getTextWidth(level_text, FONT_MENU_1);
+#endif
#endif
DrawText(mSX + 32 + name_width, mSY + 2 * 32, setup.player_name,
FONT_INPUT_1);
+
+#if 1
+ DrawText(mSX + getCurrentLevelTextPos() * 32, mSY + 3 * 32,
+ int2str(level_nr, 3), FONT_VALUE_1);
+#else
#if 1
DrawText(mSX + level_width + 2 * 32, mSY + 3 * 32, int2str(level_nr, 3),
FONT_VALUE_1);
#else
DrawText(mSX + level_width + 5 * 32, mSY + 3 * 32, int2str(level_nr, 3),
FONT_VALUE_1);
+#endif
#endif
DrawMicroLevel(MICROLEVEL_XPOS, MICROLEVEL_YPOS, TRUE);
#if 1
{
int text_height = getFontHeight(FONT_TEXT_3);
+#if 1
+ int xpos = getLevelRangeTextPos() * 32;
+#else
+ int xpos = level_width + 6 * 32;
+#endif
int ypos2 = -SY + 3 * 32 + 16;
int ypos1 = ypos2 - text_height;
- DrawTextF(mSX + level_width + 6 * 32, mSY + ypos1, FONT_TEXT_3,
+ DrawTextF(mSX + xpos, mSY + ypos1, FONT_TEXT_3,
"%03d", leveldir_current->first_level);
- DrawTextF(mSX + level_width + 6 * 32, mSY + ypos2, FONT_TEXT_3,
+ DrawTextF(mSX + xpos, mSY + ypos2, FONT_TEXT_3,
"%03d", leveldir_current->last_level);
}
#else
initCursor(i, (i == 1 || i == 4 || i == 6 ? IMG_MENU_BUTTON_ENTER_MENU :
IMG_MENU_BUTTON));
+#if 1
+ drawCursorXY(getLastLevelButtonPos(), 1, IMG_MENU_BUTTON_LAST_LEVEL);
+ drawCursorXY(getNextLevelButtonPos(), 1, IMG_MENU_BUTTON_NEXT_LEVEL);
+#else
#if 1
drawCursorXY(level_width / 32 + 1, 1, IMG_MENU_BUTTON_LEFT);
drawCursorXY(level_width / 32 + 5, 1, IMG_MENU_BUTTON_RIGHT);
#else
drawCursorXY(level_width / 32 + 4, 1, IMG_MENU_BUTTON_LEFT);
drawCursorXY(level_width / 32 + 8, 1, IMG_MENU_BUTTON_RIGHT);
+#endif
#endif
DrawTextSCentered(326, FONT_TITLE_2, "A Game by Artsoft Entertainment");
+#if 0
FadeToFront();
+#endif
+#if 0
InitAnimation();
+#endif
HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE);
PlayMenuSound();
PlayMenuMusic();
+#if 0
+#if 1
OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
+#else
+ if (fade_delay > 0)
+ OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
+ else
+ OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
+#endif
+#endif
+
+#if 0
+ InitAnimation();
+#endif
+
+#if 1
+ /* map gadgets for main menu screen */
+ MapTapeButtons();
+#endif
+
+#if 1
+#if 1
+ FadeIn(fade_delay);
+#else
+ BackToFront();
+#endif
+#endif
+
+#if 1
+ InitAnimation();
+#endif
+
+#if 1
+ OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
+#endif
+}
+
+void DrawMainMenu()
+{
+ DrawMainMenuExt(0);
}
#if 0
}
#endif
+void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
+{
+ static int title_nr = 0;
+ boolean return_to_main_menu = FALSE;
+ boolean use_fading_main_menu = TRUE;
+ boolean use_cross_fading = TRUE;
+ int fade_delay = 500;
+ int post_delay = fade_delay / 2;
+
+ if (button == MB_MENU_INITIALIZE)
+ {
+ int last_game_status = game_status; /* save current game status */
+ title_nr = 0;
+
+ if (game_status == GAME_MODE_INFO)
+ {
+ if (graphic_info[IMG_TITLESCREEN_1].bitmap == NULL)
+ {
+ DrawInfoScreen_NotAvailable("Title screen information:",
+ "No title screen for this level set.");
+
+ return;
+ }
+
+ FadeSoundsAndMusic();
+
+ FadeOut(fade_delay, post_delay);
+ }
+
+ /* force TITLE music on title info screen */
+ game_status = GAME_MODE_TITLE;
+
+ PlayMenuSound();
+ PlayMenuMusic();
+
+ game_status = last_game_status; /* restore current game status */
+
+ DrawTitleScreenImage(title_nr);
+
+ FadeIn(fade_delay);
+
+ return;
+ }
+ else if (button == MB_MENU_LEAVE)
+ {
+ return_to_main_menu = TRUE;
+ use_fading_main_menu = FALSE;
+ }
+ else if (button == MB_MENU_CHOICE)
+ {
+ if (game_status == GAME_MODE_INFO &&
+ graphic_info[IMG_TITLESCREEN_1].bitmap == NULL)
+ {
+ info_mode = INFO_MODE_MAIN;
+ DrawInfoScreen();
+
+ return;
+ }
+
+ title_nr++;
+
+ if (!use_cross_fading)
+ FadeOut(fade_delay, post_delay);
+
+ if (title_nr < MAX_NUM_TITLE_SCREENS &&
+ graphic_info[IMG_TITLESCREEN_1 + title_nr].bitmap != NULL)
+ {
+ Bitmap *drawto_last = drawto;
+
+ if (use_cross_fading)
+ drawto = bitmap_db_title;
+
+ DrawTitleScreenImage(title_nr);
+
+ drawto = drawto_last;
+
+ if (use_cross_fading)
+ FadeCross(fade_delay);
+ else
+ FadeIn(fade_delay);
+ }
+ else
+ {
+ FadeSoundsAndMusic();
+
+ FadeOut(fade_delay, post_delay);
+
+ return_to_main_menu = TRUE;
+ }
+ }
+
+ if (return_to_main_menu)
+ {
+ int menu_fade_delay = (use_fading_main_menu ? fade_delay : 0);
+
+ RedrawBackground();
+
+ 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(menu_fade_delay);
+ }
+ 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(menu_fade_delay);
+ }
+ }
+}
+
void HandleMainMenu(int mx, int my, int dx, int dy, int button)
{
static unsigned long level_delay = 0;
{
if (dx && choice == 1)
x = (dx < 0 ? 10 : 14);
+ else if (dx > 0)
+ {
+ if (choice == 4 || choice == 6)
+ button = MB_MENU_CHOICE;
+ }
else if (dy)
y = choice + dy;
}
else if (y == 3)
{
if (leveldir_current->readonly &&
- strcmp(setup.player_name, "Artsoft") != 0)
+ !strEqual(setup.player_name, "Artsoft"))
Request("This level is read only !", REQ_CONFIRM);
game_status = GAME_MODE_EDITOR;
DrawLevelEd();
static struct TokenInfo *info_info;
static int num_info_info;
+static void execInfoTitleScreen()
+{
+ info_mode = INFO_MODE_TITLE;
+ DrawInfoScreen();
+}
+
static void execInfoElements()
{
info_mode = INFO_MODE_ELEMENTS;
static struct TokenInfo info_info_main[] =
{
+ { TYPE_ENTER_SCREEN, execInfoTitleScreen, "Title Screen" },
{ TYPE_ENTER_SCREEN, execInfoElements, "Elements Info" },
{ TYPE_ENTER_SCREEN, execInfoMusic, "Music Info" },
{ TYPE_ENTER_SCREEN, execInfoCredits, "Credits" },
{ 0, NULL, NULL }
};
-static void DrawInfoScreen_Main()
+static void DrawInfoScreen_Main(int fade_delay)
{
int i;
for (i = 0; info_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
{
+ int xpos = MENU_SCREEN_START_XPOS;
int ypos = MENU_SCREEN_START_YPOS + i;
int font_nr = FONT_MENU_1;
- DrawText(mSX + 32, mSY + ypos * 32, info_info[i].text, font_nr);
+ DrawText(mSX + xpos * 32, mSY + ypos * 32, info_info[i].text, font_nr);
if (info_info[i].type & TYPE_ENTER_MENU)
initCursor(i, IMG_MENU_BUTTON_ENTER_MENU);
num_info_info++;
}
+#if 1
+
+ HandleInfoScreen_Main(0, 0, 0, 0, MB_MENU_INITIALIZE);
+
+ PlayMenuSound();
+ PlayMenuMusic();
+
+ FadeIn(fade_delay);
+ InitAnimation();
+
+#else
+
FadeToFront();
InitAnimation();
PlayMenuMusic();
HandleInfoScreen_Main(0, 0, 0, 0, MB_MENU_INITIALIZE);
+#endif
}
void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button)
}
}
+void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
+{
+ int ystart = 150;
+ int ybottom = SYSIZE - 20;
+
+ SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
+
+ ClearWindow();
+ DrawHeadline();
+
+ DrawTextSCentered(100, FONT_TEXT_1, text_title);
+
+ DrawTextSCentered(ybottom, FONT_TEXT_4,
+ "Press any key or button for info menu");
+
+ DrawTextSCentered(ystart, FONT_TEXT_2, text_error);
+}
+
void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
{
static int infoscreen_step[MAX_INFO_ELEMENTS_ON_SCREEN];
action = helpanim_info[j].action;
direction = helpanim_info[j].direction;
+ if (element < 0)
+ element = EL_UNKNOWN;
+
if (action != -1 && direction != -1)
graphic = el_act_dir2img(element, action, direction);
else if (action != -1)
graphic = el_act2img(element, action);
else if (direction != -1)
- graphic = el_act2img(element, direction);
+ graphic = el_dir2img(element, direction);
else
graphic = el2img(element);
strcat(token, element_action_info[action].suffix);
if (direction != -1)
- strcat(token, element_direction_info[MV_DIR_BIT(direction)].suffix);
+ strcat(token, element_direction_info[MV_DIR_TO_BIT(direction)].suffix);
return getHashEntry(helptext_info, token);
}
max_chars_per_line, max_lines_per_text);
}
+void DrawInfoScreen_TitleScreen()
+{
+ DrawTitleScreen();
+}
+
+void HandleInfoScreen_TitleScreen(int button)
+{
+ HandleTitleScreen(0, 0, 0, 0, button);
+}
+
void DrawInfoScreen_Elements()
{
SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS);
}
else
{
- if (DelayReached(&info_delay, GAME_FRAME_DELAY))
+ if (DelayReached(&info_delay, GameFrameDelay))
if (page < num_pages)
DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, FALSE);
DrawTextSCentered(100, FONT_TEXT_1, "The Game Background Music:");
}
- if (strcmp(list->title, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->title, UNKNOWN_NAME))
{
- if (strcmp(list->title_header, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->title_header, UNKNOWN_NAME))
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->title_header);
DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "\"%s\"", list->title);
}
- if (strcmp(list->artist, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->artist, UNKNOWN_NAME))
{
- if (strcmp(list->artist_header, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->artist_header, UNKNOWN_NAME))
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->artist_header);
else
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, "by");
DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "%s", list->artist);
}
- if (strcmp(list->album, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->album, UNKNOWN_NAME))
{
- if (strcmp(list->album_header, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->album_header, UNKNOWN_NAME))
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->album_header);
else
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, "from the album");
DrawTextFCentered(ystart + y++ * dy, FONT_TEXT_3, "\"%s\"", list->album);
}
- if (strcmp(list->year, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->year, UNKNOWN_NAME))
{
- if (strcmp(list->year_header, UNKNOWN_NAME) != 0)
+ if (!strEqual(list->year_header, UNKNOWN_NAME))
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, list->year_header);
else
DrawTextSCentered(ystart + y++ * dy, FONT_TEXT_2, "from the year");
PlaySoundLoop(list->music);
}
-void DrawInfoScreen_Credits()
+static boolean DrawInfoScreen_CreditsScreen(int screen_nr)
{
int ystart = 150, ystep = 30;
int ybottom = SYSIZE - 20;
- SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_CREDITS);
-
- FadeSoundsAndMusic();
-
ClearWindow();
DrawHeadline();
DrawTextSCentered(100, FONT_TEXT_1, "Credits:");
- DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2, "DOS port of the game:");
- DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3, "Guido Schulz");
- DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2, "Additional toons:");
- DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3, "Karl Hörnell");
- DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2,
- "...and many thanks to all contributors");
- DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2, "of new levels!");
+
+ if (screen_nr == 0)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Special thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Peter Liepa");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for creating");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "\"Boulder Dash\"");
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ "in the year");
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ "1984");
+ DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ "published by");
+ DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ "First Star Software");
+ }
+ else if (screen_nr == 1)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Special thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Klaus Heinz & Volker Wertich");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for creating");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "\"Emerald Mine\"");
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ "in the year");
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ "1987");
+ DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ "published by");
+ DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ "Kingsoft");
+ }
+ else if (screen_nr == 2)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Special thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Michael Stopp & Philip Jespersen");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for creating");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "\"Supaplex\"");
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ "in the year");
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ "1991");
+ DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ "published by");
+ DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ "Digital Integration");
+ }
+ else if (screen_nr == 3)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Special thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Hiroyuki Imabayashi");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for creating");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "\"Sokoban\"");
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ "in the year");
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ "1982");
+ DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ "published by");
+ DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_3,
+ "Thinking Rabbit");
+ }
+ else if (screen_nr == 4)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Special thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Alan Bond");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "and");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "Jürgen Bonhagen");
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ "for the continuous creation");
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2,
+ "of outstanding level sets");
+ }
+ else if (screen_nr == 5)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Peter Elzner");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for ideas and inspiration by");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "Diamond Caves");
+
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_2,
+ "Thanks to");
+ DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_3,
+ "Steffest");
+ DrawTextSCentered(ystart + 7 * ystep, FONT_TEXT_2,
+ "for ideas and inspiration by");
+ DrawTextSCentered(ystart + 8 * ystep, FONT_TEXT_3,
+ "DX-Boulderdash");
+ }
+ else if (screen_nr == 6)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "David Tritscher");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for the new Emerald Mine engine");
+ }
+ else if (screen_nr == 7)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "Thanks to");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_3,
+ "Guido Schulz");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_2,
+ "for the initial DOS port");
+
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_2,
+ "Thanks to");
+ DrawTextSCentered(ystart + 5 * ystep, FONT_TEXT_3,
+ "Karl Hörnell");
+ DrawTextSCentered(ystart + 6 * ystep, FONT_TEXT_2,
+ "for some additional toons");
+ }
+ else if (screen_nr == 8)
+ {
+ DrawTextSCentered(ystart + 0 * ystep, FONT_TEXT_2,
+ "And not to forget:");
+ DrawTextSCentered(ystart + 1 * ystep, FONT_TEXT_2,
+ "Many thanks to");
+ DrawTextSCentered(ystart + 2 * ystep, FONT_TEXT_3,
+ "All those who contributed");
+ DrawTextSCentered(ystart + 3 * ystep, FONT_TEXT_3,
+ "levels to this game");
+ DrawTextSCentered(ystart + 4 * ystep, FONT_TEXT_3,
+ "since 1995");
+ }
+ else
+ {
+ return FALSE;
+ }
DrawTextSCentered(ybottom, FONT_TEXT_4,
- "Press any key or button for info menu");
+ "Press any key or button for next page");
+
+ return TRUE;
+}
+
+void DrawInfoScreen_Credits()
+{
+ SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_CREDITS);
+
+ FadeSoundsAndMusic();
+
+ HandleInfoScreen_Credits(MB_MENU_INITIALIZE);
}
void HandleInfoScreen_Credits(int button)
{
- int button_released = !button;
+ static int screen_nr = 0;
- if (button == MB_MENU_LEAVE)
+ if (button == MB_MENU_INITIALIZE)
+ {
+ screen_nr = 0;
+
+ DrawInfoScreen_CreditsScreen(screen_nr);
+ }
+ else if (button == MB_MENU_LEAVE)
{
info_mode = INFO_MODE_MAIN;
DrawInfoScreen();
return;
}
-
- if (button_released)
+ else if (button == MB_MENU_CHOICE)
{
- FadeSoundsAndMusic();
+ screen_nr++;
- info_mode = INFO_MODE_MAIN;
- DrawInfoScreen();
+ if (!DrawInfoScreen_CreditsScreen(screen_nr))
+ {
+ FadeSoundsAndMusic();
+
+ info_mode = INFO_MODE_MAIN;
+ DrawInfoScreen();
+ }
}
else
{
}
}
-void DrawInfoScreen()
+static void DrawInfoScreenExt(int fade_delay)
{
SetMainBackgroundImage(IMG_BACKGROUND_INFO);
- if (info_mode == INFO_MODE_ELEMENTS)
+ if (info_mode == INFO_MODE_TITLE)
+ DrawInfoScreen_TitleScreen();
+ else if (info_mode == INFO_MODE_ELEMENTS)
DrawInfoScreen_Elements();
else if (info_mode == INFO_MODE_MUSIC)
DrawInfoScreen_Music();
else if (info_mode == INFO_MODE_LEVELSET)
DrawInfoScreen_LevelSet();
else
- DrawInfoScreen_Main();
+ DrawInfoScreen_Main(fade_delay);
- if (info_mode != INFO_MODE_MUSIC)
+ if (info_mode != INFO_MODE_MAIN &&
+ info_mode != INFO_MODE_TITLE &&
+ info_mode != INFO_MODE_MUSIC)
{
PlayMenuSound();
PlayMenuMusic();
}
}
+void DrawInfoScreen()
+{
+ DrawInfoScreenExt(0);
+}
+
void HandleInfoScreen(int mx, int my, int dx, int dy, int button)
{
- if (info_mode == INFO_MODE_ELEMENTS)
+ if (info_mode == INFO_MODE_TITLE)
+ HandleInfoScreen_TitleScreen(button);
+ else if (info_mode == INFO_MODE_ELEMENTS)
HandleInfoScreen_Elements(button);
else if (info_mode == INFO_MODE_MUSIC)
HandleInfoScreen_Music(button);
TreeInfo *ti)
{
int i;
- char buffer[SCR_FIELDX * 2];
- int max_buffer_len = (SCR_FIELDX - 2) * 2;
char *title_string = NULL;
#if 0
int xoffset_sets = 16;
/* clear tree list area, but not title or scrollbar */
DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
- SXSIZE - 32 + menu.scrollbar_xoffset,
+ SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset,
MAX_MENU_ENTRIES_ON_SCREEN * 32);
for (i = 0; i < num_page_entries; i++)
{
TreeInfo *node, *node_first;
int entry_pos = first_entry + i;
+ int xpos = MENU_SCREEN_START_XPOS;
int ypos = MENU_SCREEN_START_YPOS + i;
+ int startx = mSX + xpos * 32;
+ int starty = mSY + ypos * 32;
+ int font_nr = FONT_TEXT_1;
+ int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
+ int startx_text = startx + font_xoffset;
+ int startx_scrollbar = mSX + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
+ int text_size = startx_scrollbar - startx_text;
+ int max_buffer_len = text_size / getFontWidth(font_nr);
+ char buffer[max_buffer_len + 1];
node_first = getTreeInfoFirstGroupEntry(ti);
node = getTreeInfoFromPos(node_first, entry_pos);
strncpy(buffer, node->name, max_buffer_len);
buffer[max_buffer_len] = '\0';
- DrawText(mSX + 32, mSY + ypos * 32, buffer, FONT_TEXT_1 + node->color);
+ DrawText(startx, starty, buffer, font_nr + node->color);
if (node->parent_link)
initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU);
DrawText(mSX, sy, int2str(entry + 1, 3), font_nr1);
DrawText(mSX + dx1, sy, ".", font_nr1);
DrawText(mSX + dx2, sy, ".........................", font_nr3);
- if (strcmp(highscore[entry].Name, EMPTY_PLAYER_NAME) != 0)
+
+ if (!strEqual(highscore[entry].Name, EMPTY_PLAYER_NAME))
DrawText(mSX + dx2, sy, highscore[entry].Name, font_nr2);
+
DrawText(mSX + dx3, sy, int2str(highscore[entry].Score, 5), font_nr4);
}
DrawSetupScreen();
}
-static void execSetupShortcut()
+static void execSetupShortcut1()
+{
+ setup_mode = SETUP_MODE_SHORTCUT_1;
+ DrawSetupScreen();
+}
+
+static void execSetupShortcut2()
{
- setup_mode = SETUP_MODE_SHORTCUT;
+ setup_mode = SETUP_MODE_SHORTCUT_2;
DrawSetupScreen();
}
static struct TokenInfo setup_info_main[] =
{
- { TYPE_ENTER_MENU, execSetupGame, "Game Settings" },
- { TYPE_ENTER_MENU, execSetupEditor, "Editor Settings" },
+ { TYPE_ENTER_MENU, execSetupGame, "Game & Menu" },
+ { TYPE_ENTER_MENU, execSetupEditor, "Editor" },
{ TYPE_ENTER_MENU, execSetupGraphics, "Graphics" },
{ TYPE_ENTER_MENU, execSetupSound, "Sound & Music" },
{ TYPE_ENTER_MENU, execSetupArtwork, "Custom Artwork" },
{ TYPE_ENTER_MENU, execSetupInput, "Input Devices" },
- { TYPE_ENTER_MENU, execSetupShortcut, "Key Shortcuts" },
+ { TYPE_ENTER_MENU, execSetupShortcut1, "Key Shortcuts 1" },
+ { TYPE_ENTER_MENU, execSetupShortcut2, "Key Shortcuts 2" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execExitSetup, "Exit" },
{ TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and Exit" },
static struct TokenInfo setup_info_game[] =
{
- { TYPE_SWITCH, &setup.team_mode, "Team-Mode:" },
+ { TYPE_SWITCH, &setup.team_mode, "Team-Mode (Multi-Player):" },
+ { TYPE_YES_NO, &setup.input_on_focus, "Only Move Focussed Player:" },
{ TYPE_SWITCH, &setup.handicap, "Handicap:" },
- { TYPE_SWITCH, &setup.skip_levels, "Skip Levels:" },
- { TYPE_SWITCH, &setup.time_limit, "Timelimit:" },
- { TYPE_SWITCH, &setup.autorecord, "Auto-Record:" },
+ { TYPE_SWITCH, &setup.skip_levels, "Skip Unsolved Levels:" },
+ { TYPE_SWITCH, &setup.time_limit, "Time Limit:" },
+ { TYPE_SWITCH, &setup.autorecord, "Auto-Record Tapes:" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
static struct TokenInfo setup_info_editor[] =
{
#if 0
- { TYPE_STRING, NULL, "Offer Special Elements:"},
-#endif
-
-#if 0
-#else
- { TYPE_SWITCH, &setup.editor.el_boulderdash, "BoulderDash:" },
+ { TYPE_SWITCH, &setup.editor.el_boulderdash, "Boulder Dash:" },
{ TYPE_SWITCH, &setup.editor.el_emerald_mine, "Emerald Mine:" },
- { TYPE_SWITCH, &setup.editor.el_emerald_mine_club,"E.M.C.:" },
- { TYPE_SWITCH, &setup.editor.el_more, "R'n'D:" },
+ { TYPE_SWITCH, &setup.editor.el_emerald_mine_club, "Emerald Mine Club:" },
+ { TYPE_SWITCH, &setup.editor.el_more, "Rocks'n'Diamonds:" },
{ TYPE_SWITCH, &setup.editor.el_sokoban, "Sokoban:" },
{ TYPE_SWITCH, &setup.editor.el_supaplex, "Supaplex:" },
- { TYPE_SWITCH, &setup.editor.el_diamond_caves, "DC II:" },
- { TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX BD:" },
+ { TYPE_SWITCH, &setup.editor.el_diamond_caves, "Diamond Caves II:" },
+ { TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX-Boulderdash:" },
#endif
- { TYPE_SWITCH, &setup.editor.el_chars, "Characters:" },
- { TYPE_SWITCH, &setup.editor.el_custom, "Custom:" },
+ { TYPE_SWITCH, &setup.editor.el_chars, "Text Characters:" },
+ { TYPE_SWITCH, &setup.editor.el_custom, "Custom & Group Elements:" },
{ TYPE_SWITCH, &setup.editor.el_headlines, "Headlines:" },
- { TYPE_SWITCH, &setup.editor.el_user_defined, "User defined:" },
- { TYPE_SWITCH, &setup.editor.el_dynamic, "Dynamic:" },
+ { TYPE_SWITCH, &setup.editor.el_user_defined, "User defined element list:" },
+ { TYPE_SWITCH, &setup.editor.el_dynamic, "Dynamic level elements:" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_SWITCH, &setup.editor.show_element_token, "Show element token:" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
static struct TokenInfo setup_info_graphics[] =
{
- { TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" },
- { TYPE_SWITCH, &setup.scroll_delay, "Scroll Delay:" },
- { TYPE_SWITCH, &setup.soft_scrolling, "Soft Scroll.:" },
+ { TYPE_SWITCH, &setup.fullscreen, "Fullscreen Mode:" },
+ { TYPE_SWITCH, &setup.scroll_delay, "Delayed Scrolling:" },
#if 0
- { TYPE_SWITCH, &setup.double_buffering,"Buffered gfx:" },
+ { TYPE_SWITCH, &setup.soft_scrolling, "Soft Scrolling:" },
+ { TYPE_SWITCH, &setup.double_buffering,"Double-Buffering:" },
{ TYPE_SWITCH, &setup.fading, "Fading:" },
#endif
- { TYPE_SWITCH, &setup.quick_doors, "Quick Doors:" },
- { TYPE_SWITCH, &setup.toons, "Toons:" },
+ { TYPE_SWITCH, &setup.quick_switch, "Quick Player Focus Switch:" },
+ { TYPE_SWITCH, &setup.quick_doors, "Quick Menu Doors:" },
+ { TYPE_SWITCH, &setup.show_titlescreen,"Show Title Screens:" },
+ { TYPE_SWITCH, &setup.toons, "Show Toons:" },
+ { TYPE_ECS_AGA, &setup.prefer_aga_graphics,"EMC graphics preference:" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
static struct TokenInfo setup_info_sound[] =
{
- { TYPE_SWITCH, &setup.sound_simple, "Simple Sound:" },
- { TYPE_SWITCH, &setup.sound_loops, "Sound Loops:" },
- { TYPE_SWITCH, &setup.sound_music, "Game Music:" },
+ { TYPE_SWITCH, &setup.sound_simple, "Sound Effects (Normal):" },
+ { TYPE_SWITCH, &setup.sound_loops, "Sound Effects (Looping):" },
+ { TYPE_SWITCH, &setup.sound_music, "Music:" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
{ TYPE_ENTER_MENU, execSetupChooseMusic, "Custom Music" },
{ TYPE_STRING, &music_set_name, "" },
{ TYPE_EMPTY, NULL, "" },
+#if 1
+ { TYPE_YES_NO, &setup.override_level_graphics,"Override Level Graphics:" },
+ { TYPE_YES_NO, &setup.override_level_sounds, "Override Level Sounds:" },
+ { TYPE_YES_NO, &setup.override_level_music, "Override Level Music:" },
+#else
{ TYPE_STRING, NULL, "Override Level Artwork:"},
{ TYPE_YES_NO, &setup.override_level_graphics, "Graphics:" },
{ TYPE_YES_NO, &setup.override_level_sounds, "Sounds:" },
{ TYPE_YES_NO, &setup.override_level_music, "Music:" },
+#endif
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
{ 0, NULL, NULL }
};
-static struct TokenInfo setup_info_shortcut[] =
+static struct TokenInfo setup_info_shortcut_1[] =
{
- { TYPE_KEYTEXT, NULL, "Quick Save Game:", },
- { TYPE_KEY, &setup.shortcut.save_game, "" },
- { TYPE_KEYTEXT, NULL, "Quick Load Game:", },
- { TYPE_KEY, &setup.shortcut.load_game, "" },
- { TYPE_KEYTEXT, NULL, "Toggle Pause:", },
- { TYPE_KEY, &setup.shortcut.toggle_pause, "" },
+ { TYPE_KEYTEXT, NULL, "Quick Save Game to Tape:", },
+ { TYPE_KEY, &setup.shortcut.save_game, "" },
+ { TYPE_KEYTEXT, NULL, "Quick Load Game from Tape:", },
+ { TYPE_KEY, &setup.shortcut.load_game, "" },
+ { TYPE_KEYTEXT, NULL, "Start Game & Toggle Pause:", },
+ { TYPE_KEY, &setup.shortcut.toggle_pause, "" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_YES_NO, &setup.ask_on_escape, "Ask on 'Esc' Key:" },
+ { TYPE_YES_NO, &setup.ask_on_escape_editor, "Ask on 'Esc' Key (Editor):" },
{ TYPE_EMPTY, NULL, "" },
- { TYPE_YES_NO, &setup.ask_on_escape, "Ask on Esc:" },
+ { TYPE_LEAVE_MENU, execSetupMain, "Back" },
+
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_shortcut_2[] =
+{
+ { TYPE_KEYTEXT, NULL, "Set Focus to Player 1:", },
+ { TYPE_KEY, &setup.shortcut.focus_player[0], "" },
+ { TYPE_KEYTEXT, NULL, "Set Focus to Player 2:", },
+ { TYPE_KEY, &setup.shortcut.focus_player[1], "" },
+ { TYPE_KEYTEXT, NULL, "Set Focus to Player 3:", },
+ { TYPE_KEY, &setup.shortcut.focus_player[2], "" },
+ { TYPE_KEYTEXT, NULL, "Set Focus to Player 4:", },
+ { TYPE_KEY, &setup.shortcut.focus_player[3], "" },
+ { TYPE_KEYTEXT, NULL, "Set Focus to All Players:", },
+ { TYPE_KEY, &setup.shortcut.focus_player_all, "" },
{ TYPE_EMPTY, NULL, "" },
{ TYPE_LEAVE_MENU, execSetupMain, "Back" },
return key;
}
+static int getSetupTextFont(int type)
+{
+ if (type & (TYPE_SWITCH |
+ TYPE_YES_NO |
+ TYPE_STRING |
+ TYPE_ECS_AGA |
+ TYPE_KEYTEXT))
+ return FONT_MENU_2;
+ else
+ return FONT_MENU_1;
+}
+
+static int getSetupValueFont(int type, void *value)
+{
+ if (type & TYPE_KEY)
+ return (type & TYPE_QUERY ? FONT_INPUT_1_ACTIVE : FONT_VALUE_1);
+ else if (type & TYPE_STRING)
+ return FONT_VALUE_2;
+ else if (type & TYPE_ECS_AGA)
+ return FONT_VALUE_1;
+ else if (type & TYPE_BOOLEAN_STYLE)
+ return (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF);
+ else
+ return FONT_VALUE_1;
+}
+
static void drawSetupValue(int pos)
{
+ boolean font_draw_xoffset_modified = FALSE;
+ int font_draw_xoffset_old = -1;
int xpos = MENU_SCREEN_VALUE_XPOS;
int ypos = MENU_SCREEN_START_YPOS + pos;
- int font_nr = FONT_VALUE_1;
+ int startx = mSX + xpos * 32;
+ int starty = mSY + ypos * 32;
+ int font_nr, font_width;
int type = setup_info[pos].type;
void *value = setup_info[pos].value;
- char *value_string = (!(type & TYPE_GHOSTED) ? getSetupValue(type, value) :
- "n/a");
+ char *value_string = getSetupValue(type, value);
+ int i;
if (value_string == NULL)
return;
if (type & TYPE_KEY)
{
+#if 1
+ xpos = MENU_SCREEN_START_XPOS;
+#else
xpos = 3;
+#endif
if (type & TYPE_QUERY)
{
value_string = "<press key>";
+#if 0
font_nr = FONT_INPUT_1_ACTIVE;
+#endif
}
}
else if (type & TYPE_STRING)
{
int max_value_len = (SCR_FIELDX - 2) * 2;
- xpos = 1;
+ xpos = MENU_SCREEN_START_XPOS;
+#if 0
font_nr = FONT_VALUE_2;
+#endif
if (strlen(value_string) > max_value_len)
value_string[max_value_len] = '\0';
}
+ else if (type & TYPE_ECS_AGA)
+ {
+#if 0
+ font_nr = FONT_VALUE_1;
+#endif
+ }
else if (type & TYPE_BOOLEAN_STYLE)
{
+#if 0
font_nr = (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF);
+#endif
+ }
+
+ startx = mSX + xpos * 32;
+ starty = mSY + ypos * 32;
+ font_nr = getSetupValueFont(type, value);
+ font_width = getFontWidth(font_nr);
+
+ /* downward compatibility correction for Juergen Bonhagen's menu settings */
+ if (setup_mode != SETUP_MODE_INPUT)
+ {
+ int check_font_nr = FONT_OPTION_ON; /* known font that needs correction */
+ int font1_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
+ int font2_xoffset = getFontBitmapInfo(check_font_nr)->draw_xoffset;
+ int text_startx = mSX + MENU_SCREEN_START_XPOS * 32;
+ int text_font_nr = getSetupTextFont(FONT_MENU_2);
+ int text_font_xoffset = getFontBitmapInfo(text_font_nr)->draw_xoffset;
+ int text_width = MAX_MENU_TEXT_LENGTH_MEDIUM * getFontWidth(text_font_nr);
+ boolean correct_font_draw_xoffset = FALSE;
+
+ if (xpos == MENU_SCREEN_START_XPOS &&
+ startx + font1_xoffset < text_startx + text_font_xoffset)
+ correct_font_draw_xoffset = TRUE;
+
+ if (xpos == MENU_SCREEN_VALUE_XPOS &&
+ startx + font2_xoffset < text_startx + text_width + text_font_xoffset)
+ correct_font_draw_xoffset = TRUE;
+
+#if 0
+ printf("::: %d + %d < %d + %d + %d\n",
+ startx, font_xoffset, text_startx, text_width, text_font_xoffset);
+ printf("::: => need correction == %d\n", correct_font_draw_xoffset);
+#endif
+
+ /* check if setup value would overlap with setup text when printed */
+ /* (this can happen for extreme/wrong values for font draw offset) */
+ if (correct_font_draw_xoffset)
+ {
+ font_draw_xoffset_old = getFontBitmapInfo(font_nr)->draw_xoffset;
+ font_draw_xoffset_modified = TRUE;
+
+ if (type & TYPE_KEY)
+ getFontBitmapInfo(font_nr)->draw_xoffset += 2 * getFontWidth(font_nr);
+ else if (!(type & TYPE_STRING))
+ getFontBitmapInfo(font_nr)->draw_xoffset = text_font_xoffset + 20 -
+ MAX_MENU_TEXT_LENGTH_MEDIUM * (16 - getFontWidth(text_font_nr));
+ }
}
- DrawText(mSX + xpos * 32, mSY + ypos * 32,
+#if 1
+ for (i = 0; i <= MENU_SCREEN_MAX_XPOS - xpos; i++)
+ DrawText(startx + i * font_width, starty, " ", font_nr);
+#else
+#if 1
+ for (i = xpos; i <= MENU_SCREEN_MAX_XPOS; i++)
+ DrawText(mSX + i * 32, starty, " ", font_nr);
+#else
+ DrawText(startx, starty,
(xpos == 3 ? " " : " "), font_nr);
- DrawText(mSX + xpos * 32, mSY + ypos * 32, value_string, font_nr);
+#endif
+#endif
+
+ DrawText(startx, starty, value_string, font_nr);
+
+ if (font_draw_xoffset_modified)
+ getFontBitmapInfo(font_nr)->draw_xoffset = font_draw_xoffset_old;
}
static void changeSetupValue(int pos)
setup_info = setup_info_artwork;
title_string = "Custom Artwork";
}
- else if (setup_mode == SETUP_MODE_SHORTCUT)
+ else if (setup_mode == SETUP_MODE_SHORTCUT_1)
{
- setup_info = setup_info_shortcut;
+ setup_info = setup_info_shortcut_1;
+ title_string = "Setup Shortcuts";
+ }
+ else if (setup_mode == SETUP_MODE_SHORTCUT_2)
+ {
+ setup_info = setup_info_shortcut_2;
title_string = "Setup Shortcuts";
}
for (i = 0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
{
void *value_ptr = setup_info[i].value;
+ int xpos = MENU_SCREEN_START_XPOS;
int ypos = MENU_SCREEN_START_YPOS + i;
+#if 1
+ int font_nr;
+#else
int font_nr = FONT_MENU_1;
+#endif
/* set some entries to "unchangeable" according to other variables */
if ((value_ptr == &setup.sound_simple && !audio.sound_available) ||
(value_ptr == &setup.fullscreen && !video.fullscreen_available))
setup_info[i].type |= TYPE_GHOSTED;
+#if 1
+ font_nr = getSetupTextFont(setup_info[i].type);
+#else
+#if 1
+ if (setup_info[i].type & (TYPE_SWITCH |
+ TYPE_YES_NO |
+ TYPE_STRING |
+ TYPE_ECS_AGA |
+ TYPE_KEYTEXT))
+ font_nr = FONT_MENU_2;
+#else
if (setup_info[i].type & TYPE_STRING)
font_nr = FONT_MENU_2;
+#endif
+#endif
- DrawText(mSX + 32, mSY + ypos * 32, setup_info[i].text, font_nr);
+ DrawText(mSX + xpos * 32, mSY + ypos * 32, setup_info[i].text, font_nr);
if (setup_info[i].type & TYPE_ENTER_MENU)
initCursor(i, IMG_MENU_BUTTON_ENTER_MENU);
"Joystick4"
};
+ InitJoysticks();
+
custom_key = setup.input[player_nr].key;
DrawText(mSX + 11 * 32, mSY + 2 * 32, int2str(player_nr + 1, 1),
if (setup.input[player_nr].use_joystick)
{
char *device_name = setup.input[player_nr].joy.device_name;
+ char *text = joystick_name[getJoystickNrFromDeviceName(device_name)];
+ int font_nr = (joystick.fd[player_nr] < 0 ? FONT_VALUE_OLD : FONT_VALUE_1);
- DrawText(mSX + 8 * 32, mSY + 3 * 32,
- joystick_name[getJoystickNrFromDeviceName(device_name)],
- FONT_VALUE_1);
+ DrawText(mSX + 8 * 32, mSY + 3 * 32, text, font_nr);
DrawText(mSX + 32, mSY + 4 * 32, "Calibrate", FONT_MENU_1);
}
else
StopAnimation();
+#if 0
DrawSetupScreen_Input();
+#endif
/* wait until the last pressed button was released */
while (Joystick(player_nr) & JOY_BUTTON)
{
if (!CalibrateJoystickMain(player_nr))
{
+ char *device_name = setup.input[player_nr].joy.device_name;
+ int nr = getJoystickNrFromDeviceName(device_name) + 1;
+ int xpos = mSX - SX;
+ int ypos = mSY - SY;
+
ClearWindow();
- DrawText(mSX + 16, mSY + 6 * 32, " JOYSTICK NOT ", FONT_TITLE_1);
- DrawText(mSX, mSY + 7 * 32, " AVAILABLE ", FONT_TITLE_1);
+ DrawTextF(xpos + 16, ypos + 6 * 32, FONT_TITLE_1, " JOYSTICK %d ", nr);
+ DrawTextF(xpos + 16, ypos + 7 * 32, FONT_TITLE_1, " NOT AVAILABLE! ");
BackToFront();
- Delay(2000); /* show error message for two seconds */
+
+ Delay(2000); /* show error message for a short time */
+
+ ClearEventQueue();
}
+
+#if 1
+ DrawSetupScreen_Input();
+#endif
}
void DrawSetupScreen()
if (game_status != GAME_MODE_PLAYING)
return;
- /* !!! FIX THIS (START) !!! */
- if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
- {
- byte *recorded_player_action;
- byte summarized_player_action = 0;
- byte tape_action[MAX_PLAYERS];
- int i;
-
- if (level.native_em_level->lev->home == 0) /* all players at home */
- {
- GameWon();
-
- if (!TAPE_IS_STOPPED(tape))
- TapeStop();
-
- if (game_status != GAME_MODE_PLAYING)
- return;
- }
-
- if (level.native_em_level->ply1->alive == 0 &&
- level.native_em_level->ply2->alive == 0) /* all dead */
- AllPlayersGone = TRUE;
-
- if (AllPlayersGone && !TAPE_IS_STOPPED(tape))
- TapeStop();
-
- /* --- game actions --- */
-
- if (tape.pausing)
- {
- /* don't use 100% CPU while in pause mode -- this should better be solved
- like in the R'n'D game engine! */
-
- Delay(10);
-
- return;
- }
-
- recorded_player_action = (tape.playing ? TapePlayAction() : NULL);
-
-#if 1
- /* !!! CHECK THIS (tape.pausing is always FALSE here!) !!! */
- if (recorded_player_action == NULL && tape.pausing)
- return;
-#endif
-
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- summarized_player_action |= stored_player[i].action;
-
- if (!network_playing)
- stored_player[i].effective_action = stored_player[i].action;
- }
-
- if (!options.network && !setup.team_mode)
- local_player->effective_action = summarized_player_action;
-
- if (recorded_player_action != NULL)
- for (i = 0; i < MAX_PLAYERS; i++)
- stored_player[i].effective_action = recorded_player_action[i];
+ GameActions(); /* main game loop */
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- tape_action[i] = stored_player[i].effective_action;
-
- /* !!! (this does not happen in the EM engine) !!! */
- if (tape.recording && tape_action[i] && !tape.player_participates[i])
- tape.player_participates[i] = TRUE; /* player just appeared from CE */
- }
-
- /* only save actions from input devices, but not programmed actions */
- if (tape.recording)
- TapeRecordAction(tape_action);
-
- GameActions_EM(local_player->effective_action);
-
- if (TimeFrames >= FRAMES_PER_SECOND)
- {
- TimeFrames = 0;
- TapeTime++;
-
- if (!level.use_step_counter)
- {
- TimePlayed++;
-
- if (TimeLeft > 0)
- {
- TimeLeft--;
-
- if (TimeLeft <= 10 && setup.time_limit)
- PlaySoundStereo(SND_GAME_RUNNING_OUT_OF_TIME, SOUND_MIDDLE);
-
- DrawGameValue_Time(TimeLeft);
-
- if (!TimeLeft && setup.time_limit)
- level.native_em_level->lev->killed_out_of_time = TRUE;
- }
- else if (level.time == 0 && level.native_em_level->lev->home > 0)
- DrawGameValue_Time(TimePlayed);
-
- level.native_em_level->lev->time =
- (level.time == 0 ? TimePlayed : TimeLeft);
- }
-
- if (tape.recording || tape.playing)
- DrawVideoDisplay(VIDEO_STATE_TIME_ON, TapeTime);
- }
-
- FrameCounter++;
- TimeFrames++;
-
- BackToFront();
- }
- else
- {
- if (game.restart_level)
- StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
-
- if (local_player->LevelSolved)
- GameWon();
-
- if (AllPlayersGone && !TAPE_IS_STOPPED(tape))
- TapeStop();
-
- GameActions();
- BackToFront();
-
- if (tape.auto_play && !tape.playing)
- AutoPlayTape(); /* continue automatically playing next tape */
- }
+ if (tape.auto_play && !tape.playing)
+ AutoPlayTape(); /* continue automatically playing next tape */
}
-void StartGameActions(boolean init_network_game, boolean record_tape,
- long random_seed)
-{
- if (record_tape)
- TapeStartRecording(random_seed);
-
-#if defined(NETWORK_AVALIABLE)
- if (init_network_game)
- {
- SendToServer_StartPlaying();
-
- return;
- }
-#endif
-
- StopAnimation();
-
- game_status = GAME_MODE_PLAYING;
-
- InitRND(random_seed);
-
- InitGame();
-}
/* ---------- new screen button stuff -------------------------------------- */
-/* graphic position and size values for buttons and scrollbars */
-#define SC_SCROLLBUTTON_XSIZE TILEX
-#define SC_SCROLLBUTTON_YSIZE TILEY
-
-#define SC_SCROLL_VERTICAL_XSIZE SC_SCROLLBUTTON_XSIZE
-#define SC_SCROLL_VERTICAL_YSIZE ((MAX_MENU_ENTRIES_ON_SCREEN - 2) * \
- SC_SCROLLBUTTON_YSIZE)
-#define SC_SCROLL_UP_XPOS (SXSIZE - SC_SCROLLBUTTON_XSIZE)
-#define SC_SCROLL_UP_YPOS (2 * SC_SCROLLBUTTON_YSIZE)
-#define SC_SCROLL_VERTICAL_XPOS SC_SCROLL_UP_XPOS
-#define SC_SCROLL_VERTICAL_YPOS (SC_SCROLL_UP_YPOS + \
- SC_SCROLLBUTTON_YSIZE)
-#define SC_SCROLL_DOWN_XPOS SC_SCROLL_UP_XPOS
-#define SC_SCROLL_DOWN_YPOS (SC_SCROLL_VERTICAL_YPOS + \
- SC_SCROLL_VERTICAL_YSIZE)
-
-#define SC_BORDER_SIZE 14
-
static struct
{
int gfx_unpressed, gfx_pressed;