{ -1, NULL },
};
+static int align_xoffset = 0;
+static int align_yoffset = 0;
+
#define DRAW_MODE(s) ((s) >= GAME_MODE_MAIN && \
(s) <= GAME_MODE_SETUP ? (s) : \
(s) == GAME_MODE_PSEUDO_TYPENAME ? \
#define mSX (SX + DRAW_XOFFSET(game_status))
#define mSY (SY + DRAW_YOFFSET(game_status))
+#define amSX (mSX + align_xoffset)
+#define amSY (mSY + align_yoffset)
+
#define NUM_MENU_ENTRIES_ON_SCREEN (menu.list_size[game_status] > 2 ? \
menu.list_size[game_status] : \
MAX_MENU_ENTRIES_ON_SCREEN)
static void drawCursorExt(int xpos, int ypos, boolean active, int graphic)
{
static int cursor_array[MAX_LEV_FIELDY];
- int x = mSX + TILEX * xpos;
- int y = mSY + TILEY * (MENU_SCREEN_START_YPOS + ypos);
+ int x = amSX + TILEX * xpos;
+ int y = amSY + TILEY * (MENU_SCREEN_START_YPOS + ypos);
if (xpos == 0)
{
{
int num_leveldirs = numTreeInfoInGroup(leveldir_current);
int leveldir_pos = posTreeInfo(leveldir_current);
- int num_page_entries;
+ int num_page_entries = MIN(num_leveldirs, NUM_MENU_ENTRIES_ON_SCREEN);
int cl_first, cl_cursor;
- if (num_leveldirs <= NUM_MENU_ENTRIES_ON_SCREEN)
- num_page_entries = num_leveldirs;
- else
- num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN;
-
cl_first = MAX(0, leveldir_pos - num_page_entries + 1);
cl_cursor = leveldir_pos - cl_first;
if (new_level_nr != old_level_nr)
{
- struct MainControlInfo *mci= getMainControlInfo(MAIN_CONTROL_LEVEL_NUMBER);
+ struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_LEVEL_NUMBER);
PlaySound(SND_MENU_ITEM_SELECTING);
UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SOLUTION, hasSolutionTape());
- // needed because DrawPreviewLevelInitial() takes some time
- BackToFront();
- // SyncDisplay();
+ // force redraw of playfield area (may be reset at this point)
+ redraw_mask |= REDRAW_FIELD;
}
}
// tree menu functions
// ============================================================================
+static int getAlignXOffsetFromTreeInfo(TreeInfo *ti)
+{
+ if (game_status != GAME_MODE_SETUP ||
+ DRAW_MODE_SETUP(setup_mode) != SETUP_MODE_CHOOSE_OTHER)
+ return 0;
+
+ int max_text_size = 0;
+ TreeInfo *node;
+
+ for (node = getTreeInfoFirstGroupEntry(ti); node != NULL; node = node->next)
+ max_text_size = MAX(max_text_size, strlen(node->name));
+
+ int num_entries = numTreeInfoInGroup(ti);
+ boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN);
+ int text_width = max_text_size * getFontWidth(FONT_TEXT_1);
+ int button_width = SC_MENUBUTTON_XSIZE;
+ int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
+ int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE);
+ int align = menu.list_setup[SETUP_MODE_CHOOSE_OTHER].align;
+ int x = ALIGNED_XPOS(0, screen_width, align) * -1;
+ int align_xoffset_raw = ALIGNED_XPOS(x, button_width + text_width, align);
+ int align_xoffset = MAX(0, align_xoffset_raw);
+
+ return align_xoffset;
+}
+
+static int getAlignYOffsetFromTreeInfo(TreeInfo *ti)
+{
+ if (game_status != GAME_MODE_SETUP ||
+ DRAW_MODE_SETUP(setup_mode) != SETUP_MODE_CHOOSE_OTHER)
+ return 0;
+
+ int num_entries = numTreeInfoInGroup(ti);
+ int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
+ int font_height = getFontHeight(FONT_TEXT_1);
+ int text_height = font_height * num_page_entries;
+ int page_height = font_height * NUM_MENU_ENTRIES_ON_SCREEN;
+ int align = menu.list_setup[SETUP_MODE_CHOOSE_OTHER].valign;
+ int y = ALIGNED_YPOS(0, page_height, align) * -1;
+ int align_yoffset_raw = ALIGNED_YPOS(y, text_height, align);
+ int align_yoffset = MAX(0, align_yoffset_raw);
+
+ return align_yoffset;
+}
+
static void DrawChooseTree(TreeInfo **ti_ptr)
{
int fade_mask = REDRAW_FIELD;
static void drawChooseTreeList(int first_entry, int num_page_entries,
TreeInfo *ti)
{
+ int num_entries = numTreeInfoInGroup(ti);
+ boolean scrollbar_needed = (num_entries > NUM_MENU_ENTRIES_ON_SCREEN);
+ int scrollbar_xpos = SC_SCROLLBAR_XPOS + menu.scrollbar_xoffset;
+ int screen_width = (scrollbar_needed ? scrollbar_xpos : SXSIZE);
+ int font_nr = FONT_TEXT_1;
+ int font_xoffset = getFontBitmapInfo(font_nr)->draw_xoffset;
int i;
char *title_string = NULL;
int yoffset_sets = MENU_TITLE1_YPOS;
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 = amSX + xpos * 32;
+ int starty = amSY + ypos * 32;
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);
+ int endx_text = amSX + screen_width;
+ int max_text_size = endx_text - startx_text;
+ int max_buffer_len = max_text_size / getFontWidth(font_nr);
char buffer[max_buffer_len + 1];
node_first = getTreeInfoFirstGroupEntry(ti);
int y = ti->cl_cursor;
int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
int num_entries = numTreeInfoInGroup(ti);
- int num_page_entries;
+ int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
boolean position_set_by_scrollbar = (dx == 999);
- if (num_entries <= NUM_MENU_ENTRIES_ON_SCREEN)
- num_page_entries = num_entries;
- else
- num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN;
-
if (button == MB_MENU_INITIALIZE)
{
int num_entries = numTreeInfoInGroup(ti);
int entry_pos = posTreeInfo(ti);
+ align_xoffset = getAlignXOffsetFromTreeInfo(ti);
+ align_yoffset = getAlignYOffsetFromTreeInfo(ti);
+
if (ti->cl_first == -1)
{
// only on initialization
if (mx || my) // mouse input
{
- x = (mx - mSX) / 32;
- y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS;
+ x = (mx - amSX) / 32;
+ y = (my - amSY) / 32 - MENU_SCREEN_START_YPOS;
}
else if (dx || dy) // keyboard or scrollbar/scrollbutton input
{
{ &setup.touch.grid_ysize[1], execSetupChooseGridYSize_1 },
{ &setup.touch.grid_ysize[1], &grid_size_text[1][1] },
+ { &setup.internal.menu_game, execSetupGame },
+ { &setup.internal.menu_editor, execSetupEditor },
+ { &setup.internal.menu_graphics, execSetupGraphics },
+ { &setup.internal.menu_sound, execSetupSound },
+ { &setup.internal.menu_artwork, execSetupArtwork },
+ { &setup.internal.menu_input, execSetupInput },
+ { &setup.internal.menu_touch, execSetupTouch },
+ { &setup.internal.menu_shortcuts, execSetupShortcuts },
+ { &setup.internal.menu_exit, execExitSetup },
+ { &setup.internal.menu_save_and_exit, execSaveAndExitSetup },
+
{ NULL, NULL }
};
void DrawSetupScreen(void)
{
+ align_xoffset = 0;
+ align_yoffset = 0;
+
if (setup_mode == SETUP_MODE_INPUT)
DrawSetupScreen_Input();
else if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED)
return FALSE;
}
+
+void DrawScreenAfterAddingSet(char *tree_subdir_new, int tree_type)
+{
+ // get tree info node of newly added level or artwork set
+ TreeInfo *tree_node_first = TREE_FIRST_NODE(tree_type);
+ TreeInfo *tree_node_new = getTreeInfoFromIdentifier(tree_node_first,
+ tree_subdir_new);
+ if (tree_node_new == NULL) // should not happen
+ return;
+
+ // if request dialog is active, do nothing
+ if (game.request_active)
+ return;
+
+ if (game_status == GAME_MODE_MAIN &&
+ tree_type == TREE_TYPE_LEVEL_DIR)
+ {
+ // when adding new level set in main menu, select it as current level set
+
+ // change current level set to newly added level set from zip file
+ leveldir_current = tree_node_new;
+
+ // change current level number to first level of newly added level set
+ level_nr = leveldir_current->first_level;
+
+ // redraw screen to reflect changed level set
+ DrawMainMenu();
+
+ // save this level set and level number as last selected level set
+ SaveLevelSetup_LastSeries();
+ SaveLevelSetup_SeriesInfo();
+ }
+ else if (game_status == GAME_MODE_LEVELS &&
+ tree_type == TREE_TYPE_LEVEL_DIR)
+ {
+ // when adding new level set in level set menu, set cursor and update screen
+
+ leveldir_current = tree_node_new;
+
+ DrawChooseTree(&leveldir_current);
+ }
+ else if (game_status == GAME_MODE_SETUP)
+ {
+ // when adding new artwork set in setup menu, set cursor and update screen
+
+ if (setup_mode == SETUP_MODE_CHOOSE_GRAPHICS &&
+ tree_type == TREE_TYPE_GRAPHICS_DIR)
+ {
+ artwork.gfx_current = tree_node_new;
+
+ DrawChooseTree(&artwork.gfx_current);
+ }
+ else if (setup_mode == SETUP_MODE_CHOOSE_SOUNDS &&
+ tree_type == TREE_TYPE_SOUNDS_DIR)
+ {
+ artwork.snd_current = tree_node_new;
+
+ DrawChooseTree(&artwork.snd_current);
+ }
+ else if (setup_mode == SETUP_MODE_CHOOSE_MUSIC &&
+ tree_type == TREE_TYPE_MUSIC_DIR)
+ {
+ artwork.mus_current = tree_node_new;
+
+ DrawChooseTree(&artwork.mus_current);
+ }
+ }
+}