menu.list_size[game_status] : \
MAX_MENU_ENTRIES_ON_SCREEN)
+#define IN_VIS_MENU(x, y) IN_FIELD(x, y, SCR_FIELDX, \
+ NUM_MENU_ENTRIES_ON_SCREEN)
+
/* title display and control definitions */
#define MAX_NUM_TITLE_SCREENS (2 * MAX_NUM_TITLE_IMAGES + \
2 * MAX_NUM_TITLE_MESSAGES)
+#define NO_DIRECT_LEVEL_SELECT (-1)
+
+
static int num_title_screens = 0;
struct TitleControlInfo
ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
if (DrawingOnBackground(dst_x, dst_y))
- {
- SetClipOrigin(bitmap, bitmap->stored_clip_gc, dst_x - src_x, dst_y - src_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);
}
}
-void HandleMainMenu_SelectLevel(int step, int direction)
+void HandleMainMenu_SelectLevel(int step, int direction, int selected_level_nr)
{
int old_level_nr = level_nr;
int new_level_nr;
- new_level_nr = old_level_nr + step * direction;
+ if (selected_level_nr != NO_DIRECT_LEVEL_SELECT)
+ new_level_nr = selected_level_nr;
+ else
+ new_level_nr = old_level_nr + step * direction;
+
if (new_level_nr < leveldir_current->first_level)
new_level_nr = leveldir_current->first_level;
if (new_level_nr > leveldir_current->last_level)
if (setup.handicap && new_level_nr > leveldir_current->handicap_level)
{
/* skipping levels is only allowed when trying to skip single level */
- if (setup.skip_levels && step == 1 &&
+ if (setup.skip_levels && new_level_nr == old_level_nr + 1 &&
Request("Level still unsolved! Skip despite handicap?", REQ_ASK))
{
leveldir_current->handicap_level++;
/* needed because DrawPreviewLevelInitial() takes some time */
BackToFront();
- SyncDisplay();
+ /* SyncDisplay(); */
}
}
if (pos == MAIN_CONTROL_LEVELS && dx != 0 && button)
{
- HandleMainMenu_SelectLevel(1, dx < 0 ? -1 : +1);
+ HandleMainMenu_SelectLevel(1, (dx < 0 ? -1 : +1), NO_DIRECT_LEVEL_SELECT);
}
else if (pos == MAIN_CONTROL_FIRST_LEVEL && !button)
{
- HandleMainMenu_SelectLevel(MAX_LEVELS, -1);
+ HandleMainMenu_SelectLevel(MAX_LEVELS, -1, NO_DIRECT_LEVEL_SELECT);
}
else if (pos == MAIN_CONTROL_LAST_LEVEL && !button)
{
- HandleMainMenu_SelectLevel(MAX_LEVELS, +1);
+ HandleMainMenu_SelectLevel(MAX_LEVELS, +1, NO_DIRECT_LEVEL_SELECT);
}
else if (pos == MAIN_CONTROL_LEVEL_NUMBER && !button)
{
y += dy;
}
- if (IN_VIS_FIELD(x, y) &&
+ if (IN_VIS_MENU(x, y) &&
y >= 0 && y < num_info_info && info_info[y].type & ~TYPE_SKIP_ENTRY)
{
if (button)
DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
"and");
DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_3,
- "Jürgen Bonhagen");
+ "J\xfcrgen Bonhagen");
DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"for the continuous creation");
DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_2,
DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
"Thanks to");
DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
- "Karl Hörnell");
+ "Karl H\xf6rnell");
DrawTextSCentered(ystart2 + 6 * ystep, FONT_TEXT_2,
"for some additional toons");
}
strcpy(last_player_name, setup.player_name);
xpos = newxpos;
+
+#if defined(TARGET_SDL2)
+ SDL_StartTextInput();
+#endif
}
else if (is_valid_key_char && xpos < MAX_PLAYER_NAME_LEN)
{
startx = mSX + ALIGNED_TEXT_XPOS(pos);
DrawText(startx, starty, setup.player_name, font_nr);
+
+#if defined(TARGET_SDL2)
+ SDL_StopTextInput();
+#endif
}
}
first_entry);
}
+static void clearMenuListArea()
+{
+ int scrollbar_xpos = mSX + SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
+
+ /* correct scrollbar position if placed outside menu (playfield) area */
+ if (scrollbar_xpos > SC_SCROLLBAR_XPOS)
+ scrollbar_xpos = SC_SCROLLBAR_XPOS;
+
+ /* clear menu list area, but not title or scrollbar */
+ DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
+ scrollbar_xpos - mSX, NUM_MENU_ENTRIES_ON_SCREEN * 32);
+}
+
static void drawChooseTreeList(int first_entry, int num_page_entries,
TreeInfo *ti)
{
DrawTextSCentered(mSY - SY + yoffset, FONT_TITLE_1, title_string);
- /* 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);
+ clearMenuListArea();
for (i = 0; i < num_page_entries; i++)
{
else
{
if (game_status == GAME_MODE_LEVELNR)
- level_nr = atoi(level_number_current->identifier);
+ {
+ int new_level_nr = atoi(level_number_current->identifier);
+
+ HandleMainMenu_SelectLevel(0, 0, new_level_nr);
+ }
game_status = GAME_MODE_MAIN;
}
if (!anyScrollbarGadgetActive() &&
- IN_VIS_FIELD(x, y) &&
+ IN_VIS_MENU(x, y) &&
mx < screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x &&
y >= 0 && y < num_page_entries)
{
else
{
if (game_status == GAME_MODE_LEVELNR)
- level_nr = atoi(level_number_current->identifier);
+ {
+ int new_level_nr = atoi(level_number_current->identifier);
+
+ HandleMainMenu_SelectLevel(0, 0, new_level_nr);
+ }
game_status = GAME_MODE_MAIN;
int font_nr4 = (active ? FONT_TEXT_4_ACTIVE : FONT_TEXT_4);
int dx1 = 3 * getFontWidth(font_nr1);
int dx2 = dx1 + getFontWidth(font_nr1);
- int dx3 = SXSIZE - 5 * getFontWidth(font_nr4);
+ int dx3 = SXSIZE - 2 * (mSX - SX) - 5 * getFontWidth(font_nr4);
int num_dots = (dx3 - dx2) / getFontWidth(font_nr3);
int sy = mSY + 64 + i * 32;
DrawSetupScreen();
}
+#if !defined(PLATFORM_ANDROID)
static void execSetupInput()
{
setup_mode = SETUP_MODE_INPUT;
DrawSetupScreen();
}
+#endif
static void execSetupShortcuts()
{
if (first_entry + num_page_entries > max_setup_info)
first_entry = 0;
- /* 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);
+ clearMenuListArea();
for (i = 0; i < num_page_entries; i++)
{
DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, title_string);
+ // determine maximal number of setup entries that can be displayed on screen
num_setup_info = 0;
- for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
+ for (i = 0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
num_setup_info++;
+ // determine maximal number of setup entries available for this setup screen
max_setup_info = 0;
for (i = 0; setup_info[i].type != 0; i++)
max_setup_info++;
setup_info[first_entry + y].type & TYPE_SKIP_ENTRY)
y += dy;
- if (!IN_VIS_FIELD(x, y))
+ if (!IN_VIS_MENU(x, y))
{
choice += y - y_old;
}
if (!anyScrollbarGadgetActive() &&
- IN_VIS_FIELD(x, y) &&
+ IN_VIS_MENU(x, y) &&
mx < screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x &&
y >= 0 && y < num_page_entries)
{
{
HandleSetupScreen_Input_Player(1, dx < 0 ? -1 : +1);
}
- else if (IN_VIS_FIELD(x, y) &&
+ else if (IN_VIS_FIELD(x, y) && // (does not use "IN_VIS_MENU()" yet)
y >= pos_start && y <= pos_end &&
!(y >= pos_empty1 && y <= pos_empty2))
{
width = SC_SCROLLBUTTON_XSIZE;
height = SC_SCROLLBUTTON_YSIZE;
+ /* correct scrollbar position if placed outside menu (playfield) area */
+ if (x > SC_SCROLL_UP_XPOS)
+ x = SC_SCROLL_UP_XPOS;
+
if (id == SCREEN_CTRL_ID_SCROLL_DOWN)
y = mSY + (SC_SCROLL_VERTICAL_YPOS +
(NUM_MENU_ENTRIES_ON_SCREEN - 2) * SC_SCROLLBUTTON_YSIZE);
width = scrollbar_info[i].width;
height = scrollbar_info[i].height;
+ /* correct scrollbar position if placed outside menu (playfield) area */
+ if (x > SC_SCROLL_VERTICAL_XPOS)
+ x = SC_SCROLL_VERTICAL_XPOS;
+
if (id == SCREEN_CTRL_ID_SCROLL_VERTICAL)
height = (NUM_MENU_ENTRIES_ON_SCREEN - 2) * SC_SCROLLBUTTON_YSIZE;
switch (id)
{
case SCREEN_CTRL_ID_PREV_LEVEL:
- HandleMainMenu_SelectLevel(step, -1);
+ HandleMainMenu_SelectLevel(step, -1, NO_DIRECT_LEVEL_SELECT);
break;
case SCREEN_CTRL_ID_NEXT_LEVEL:
- HandleMainMenu_SelectLevel(step, +1);
+ HandleMainMenu_SelectLevel(step, +1, NO_DIRECT_LEVEL_SELECT);
break;
case SCREEN_CTRL_ID_PREV_PLAYER: