return sy;
}
+static int getChooseTreeEditXPosReal(int pos)
+{
+ int xpos = getChooseTreeEditXPos(pos);
+ int font_nr = getChooseTreeEditFont(FALSE);
+ int font_xoffset = getFontDrawOffsetX(font_nr);
+
+ return xpos + font_xoffset;
+}
+
static void drawChooseTreeEdit(int ypos_raw, boolean active)
{
int sx = getChooseTreeEditXPos(POS_LEFT);
return;
}
+ // reset flag to continue playing next level from hall of fame
+ scores.continue_playing = FALSE;
+
// leveldir_current may be invalid (level group, parent link, node copy)
leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid);
{
// skipping levels is only allowed when trying to skip single level
if (setup.skip_levels && new_level_nr == old_level_nr + 1 &&
- Request("Level still unsolved! Skip despite handicap?", REQ_ASK))
+ Request("Level still unsolved! Skip it anyway?", REQ_ASK))
{
leveldir_current->handicap_level++;
SaveLevelSetup_SeriesInfo();
}
static void drawTypeNameText(char *name, struct TextPosInfo *pos,
- boolean active)
+ boolean active)
{
char text[MAX_PLAYER_NAME_LEN + 2] = { 0 };
boolean multiple_users = (game_status == GAME_MODE_PSEUDO_TYPENAMES);
int sy = (multiple_users ? amSY + pos->y : mSY + ALIGNED_TEXT_YPOS(pos));
int font_nr = (active ? FONT_ACTIVE(pos->font) : pos->font);
int font_width = getFontWidth(font_nr);
+ int font_xoffset = getFontDrawOffsetX(font_nr);
+ int font_yoffset = getFontDrawOffsetY(font_nr);
+ int font_sx = sx + font_xoffset;
+ int font_sy = sy + font_yoffset;
- DrawBackgroundForFont(sx, sy, pos->width, pos->height, font_nr);
+ DrawBackgroundForFont(font_sx, font_sy, pos->width, pos->height, font_nr);
sprintf(text, "%s%c", name, (active ? '_' : '\0'));
return align_yoffset;
}
+static void StartPlayingFromHallOfFame(void)
+{
+ level_nr = scores.next_level_nr;
+ LoadLevel(level_nr);
+
+ StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+}
+
static void DrawChooseTree(TreeInfo **ti_ptr)
{
int fade_mask = REDRAW_FIELD;
boolean restart_music = (game_status != game_status_last_screen &&
game_status_last_screen != GAME_MODE_SCOREINFO);
+ scores.continue_on_return = (game_status == GAME_MODE_SCORES &&
+ game_status_last_screen == GAME_MODE_PLAYING);
+
if (CheckFadeAll())
fade_mask = REDRAW_ALL;
{
execSetupArtwork();
}
- else // GAME_MODE_LEVELS
+ else if (game_status == GAME_MODE_SCORES && scores.continue_playing)
+ {
+ StartPlayingFromHallOfFame();
+ }
+ else
{
SetGameStatus(GAME_MODE_MAIN);
boolean has_scrollbar = screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->mapped;
int mx_scrollbar = screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x;
int mx_right_border = (has_scrollbar ? mx_scrollbar : SX + SXSIZE);
- int sx1_edit_name = getChooseTreeEditXPos(POS_LEFT);
- int sx2_edit_name = getChooseTreeEditXPos(POS_RIGHT);
+ int sx1_edit_name = getChooseTreeEditXPosReal(POS_LEFT);
+ int sx2_edit_name = getChooseTreeEditXPosReal(POS_RIGHT);
int x = 0;
int y = (ti != NULL ? ti->cl_cursor : 0);
int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
return;
}
- if (mx || my) // mouse input
+#if defined(PLATFORM_ANDROID)
+ // directly continue when touching the screen after playing
+ if ((mx || my) && scores.continue_on_return)
+ {
+ // ignore touch events until released
+ mx = my = 0;
+ }
+#endif
+
+ // any mouse click or cursor key stops leaving scores by "Return" key
+ if ((mx || my || dx || dy) && scores.continue_on_return)
{
- scores.was_just_playing = FALSE;
+ scores.continue_on_return = FALSE;
+ level_nr = scores.last_level_nr;
+ LoadLevel(level_nr);
+ }
+ if (mx || my) // mouse input
+ {
x = (mx - amSX) / 32;
y = (my - amSY) / 32 - MENU_SCREEN_START_YPOS;
}
else if (dx || dy) // keyboard or scrollbar/scrollbutton input
{
- scores.was_just_playing = FALSE;
-
// move cursor instead of scrolling when already at start/end of list
if (dy == -1 * SCROLL_LINE && ti->cl_first == 0)
dy = -1;
node_cursor->cl_first = ti->cl_first;
node_cursor->cl_cursor = ti->cl_cursor;
+
*ti_ptr = node_cursor->node_group;
DrawChooseTree(ti_ptr);
return;
}
}
- else if (dx == -1 && ti->node_parent)
+ else if ((dx == -1 || button == MB_MENU_CONTINUE) && ti->node_parent)
{
- FadeSetLeaveMenu();
+ if (game_status != GAME_MODE_SCORES)
+ FadeSetLeaveMenu();
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;
DrawChooseTree(ti_ptr);
}
node_cursor->cl_first = ti->cl_first;
node_cursor->cl_cursor = ti->cl_cursor;
+
*ti_ptr = node_cursor;
if (ti->type == TREE_TYPE_LEVEL_DIR)
}
else if (game_status == GAME_MODE_SCORES)
{
- if (setup.auto_play_next_level && setup.increment_levels &&
- scores.last_level_nr < leveldir_current->last_level &&
- scores.was_just_playing &&
- !network_playing)
+ if (scores.continue_playing && scores.continue_on_return)
{
- StartGameActions(network.enabled, setup.autorecord,
- level.random_seed);
+ StartPlayingFromHallOfFame();
+
return;
}
- else if (!scores.was_just_playing)
+ else if (!scores.continue_on_return)
{
SetGameStatus(GAME_MODE_SCOREINFO);
if (player_name_current == NULL)
player_name_current = player_name;
+ // set text size for main name input (also used on name selection screen)
+ InitializeMainControls();
+
DrawChooseTree(&player_name_current);
}
if (score_entry_current == NULL)
score_entry_current = getFirstValidTreeInfoEntry(score_entries);
+ if (score_entries != NULL && scores.continue_playing)
+ setString(&score_entries->node_group->name, BACKLINK_TEXT_NEXT);
+
// ("score_entries" and "score_entry_current" may be NULL here)
}
-void DrawHallOfFame(int level_nr)
+void DrawHallOfFame(int nr)
{
- scores.last_level_nr = level_nr;
- scores.was_just_playing = (game_status_last_screen == GAME_MODE_PLAYING);
+ scores.last_level_nr = nr;
// (this is needed when called from GameEnd() after winning a game)
KeyboardAutoRepeatOn();
SetDrawDeactivationMask(REDRAW_NONE);
SetDrawBackgroundMask(REDRAW_FIELD);
- LoadLocalAndServerScore(level_nr, TRUE);
+ LoadLocalAndServerScore(scores.last_level_nr, TRUE);
DrawHallOfFame_setScoreEntries();
int ystep_title = getMenuTextStep(spacing_title, font_title);
int ystep_para = getMenuTextStep(spacing_para, font_text);
int ystep_line = getMenuTextStep(spacing_line, font_text);
+ int xstart = mSX - SX + menu.left_spacing[GAME_MODE_SCOREINFO];
int ystart = mSY - SY + menu.top_spacing[GAME_MODE_SCOREINFO];
int ybottom = mSY - SY + SYSIZE - menu.bottom_spacing[GAME_MODE_SCOREINFO];
- int xstart1 = mSX - SX + 2 * xstep;
- int xstart2 = mSX - SX + 13 * xstep;
+ int xstart1 = xstart + xstep;
+ int xstart2 = xstart + xstep * 12;
int select_x = SX + xstart1;
int select_y1, select_y2;
int play_x, play_y;
int font_height = getFontHeight(font_text);
int tape_date_width = getTextWidth(tape_date, font_text);
int pad_left = xstart2;
- int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT;
+ int pad_right = menu.right_spacing[GAME_MODE_SCOREINFO];
int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width;
int max_lines_per_text = 5;
int lines;
UnmapAllGadgets();
+ FreeScreenGadgets();
+ CreateScreenGadgets();
+
FadeOut(REDRAW_FIELD);
// needed if different viewport properties defined after playing score tape
{ TYPE_SWITCH, &setup.multiple_users, "Multiple Users/Teams:" },
{ TYPE_YES_NO, &setup.input_on_focus, "Only Move Focussed Player:" },
{ TYPE_SWITCH, &setup.time_limit, "Time Limit:" },
- { TYPE_SWITCH, &setup.handicap, "Handicap:" },
- { TYPE_SWITCH, &setup.skip_levels, "Skip Unsolved Levels:" },
+ { TYPE_SWITCH, &setup.handicap, "Force Solving Levels:" },
+ { TYPE_SWITCH, &setup.skip_levels, "Allow Skipping Levels:" },
{ TYPE_SWITCH, &setup.increment_levels,"Increment Solved Levels:" },
{ TYPE_SWITCH, &setup.auto_play_next_level,"Auto-play Next Level:" },
{ TYPE_SWITCH, &setup.count_score_after_game,"Count Score After Game:" },
static struct TokenInfo setup_info_graphics[] =
{
-#if !defined(PLATFORM_ANDROID)
+#if !defined(PLATFORM_ANDROID) && !defined(PLATFORM_EMSCRIPTEN)
{ TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" },
{ TYPE_ENTER_LIST, execSetupChooseWindowSize, "Window Scaling:" },
{ TYPE_STRING, &window_size_text, "" },
{ TYPE_ENTER_LIST, execSetupChooseScrollDelay, "Scroll Delay:" },
{ TYPE_STRING, &scroll_delay_text, "" },
#endif
+#if !defined(PLATFORM_EMSCRIPTEN)
{ TYPE_ENTER_LIST, execSetupChooseVsyncMode, "Vertical Sync (VSync):" },
{ TYPE_STRING, &vsync_mode_text, "" },
+#endif
{ TYPE_SWITCH, &setup.fade_screens, "Fade Screens:" },
{ TYPE_SWITCH, &setup.quick_switch, "Quick Player Focus Switch:" },
{ TYPE_SWITCH, &setup.quick_doors, "Quick Menu Doors:" },
}
}
+void HandleScreenGadgetKeys(Key key)
+{
+ if (key == setup.shortcut.tape_play)
+ HandleScreenGadgets(screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE]);
+}
+
void DumpScreenIdentifiers(void)
{
int i;