-
-#else
-
-
-void DrawChooseLevel()
-{
- UnmapAllGadgets();
- CloseDoor(DOOR_CLOSE_2);
-
- ClearWindow();
- HandleChooseLevel(0,0, 0,0, MB_MENU_INITIALIZE);
- MapChooseLevelGadgets();
-
- FadeToFront();
- InitAnimation();
-}
-
-static void AdjustChooseLevelScrollbar(int id, int first_entry)
-{
- struct GadgetInfo *gi = screen_gadget[id];
- int items_max, items_visible, item_position;
-
- items_max = numTreeInfoInGroup(leveldir_current);
- items_visible = MAX_MENU_ENTRIES_ON_SCREEN - 1;
- item_position = first_entry;
-
- if (item_position > items_max - items_visible)
- item_position = items_max - items_visible;
-
- ModifyGadget(gi, GDI_SCROLLBAR_ITEMS_MAX, items_max,
- GDI_SCROLLBAR_ITEM_POSITION, item_position, GDI_END);
-}
-
-static void drawChooseLevelList(int first_entry, int num_page_entries)
-{
- int i;
- char buffer[SCR_FIELDX * 2];
- int max_buffer_len = (SCR_FIELDX - 2) * 2;
- int num_leveldirs = numTreeInfoInGroup(leveldir_current);
-
- ClearRectangle(backbuffer, SX, SY, SXSIZE - 32, SYSIZE);
- redraw_mask |= REDRAW_FIELD;
-
- DrawText(SX, SY, "Level Directories", FS_BIG, FC_GREEN);
-
- for(i=0; i<num_page_entries; i++)
- {
- LevelDirTree *node, *node_first;
- int leveldir_pos = first_entry + i;
- int ypos = MENU_SCREEN_START_YPOS + i;
-
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node = getTreeInfoFromPos(node_first, leveldir_pos);
-
- strncpy(buffer, node->name , max_buffer_len);
- buffer[max_buffer_len] = '\0';
-
- DrawText(SX + 32, SY + ypos * 32, buffer, FS_MEDIUM, node->color);
-
- if (node->parent_link)
- initCursor(i, GFX_ARROW_BLUE_LEFT);
- else if (node->level_group)
- initCursor(i, GFX_ARROW_BLUE_RIGHT);
- else
- initCursor(i, GFX_KUGEL_BLAU);
- }
-
- if (first_entry > 0)
- DrawGraphic(0, 1, GFX_ARROW_BLUE_UP);
-
- if (first_entry + num_page_entries < num_leveldirs)
- DrawGraphic(0, MAX_MENU_ENTRIES_ON_SCREEN + 1, GFX_ARROW_BLUE_DOWN);
-}
-
-static void drawChooseLevelInfo(int leveldir_pos)
-{
- LevelDirTree *node, *node_first;
- int x, last_redraw_mask = redraw_mask;
-
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node = getTreeInfoFromPos(node_first, leveldir_pos);
-
- ClearRectangle(drawto, SX + 32, SY + 32, SXSIZE - 64, 32);
-
- if (node->parent_link)
- DrawTextFCentered(40, FC_RED, "leave group \"%s\"", node->class_desc);
- else if (node->level_group)
- DrawTextFCentered(40, FC_RED, "enter group \"%s\"", node->class_desc);
- else
- DrawTextFCentered(40, FC_RED, "%3d levels (%s)",
- node->levels, node->class_desc);
-
- /* let BackToFront() redraw only what is needed */
- redraw_mask = last_redraw_mask | REDRAW_TILES;
- for (x=0; x<SCR_FIELDX; x++)
- MarkTileDirty(x, 1);
-}
-
-void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
-{
- static unsigned long choose_delay = 0;
- int x = 0;
- int y = leveldir_current->cl_cursor;
- int step = (button == 1 ? 1 : button == 2 ? 5 : 10);
- int num_leveldirs = numTreeInfoInGroup(leveldir_current);
- int num_page_entries;
-
- if (num_leveldirs <= MAX_MENU_ENTRIES_ON_SCREEN)
- num_page_entries = num_leveldirs;
- else
- num_page_entries = MAX_MENU_ENTRIES_ON_SCREEN - 1;
-
- if (button == MB_MENU_INITIALIZE)
- {
- int leveldir_pos = posTreeInfo(leveldir_current);
-
- if (leveldir_current->cl_first == -1)
- {
- leveldir_current->cl_first = MAX(0, leveldir_pos - num_page_entries + 1);
- leveldir_current->cl_cursor =
- leveldir_pos - leveldir_current->cl_first;
- }
-
- if (dx == 999) /* first entry is set by scrollbar position */
- leveldir_current->cl_first = dy;
- else
- AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
- leveldir_current->cl_first);
-
- drawChooseLevelList(leveldir_current->cl_first, num_page_entries);
- drawChooseLevelInfo(leveldir_current->cl_first +
- leveldir_current->cl_cursor);
- drawCursor(leveldir_current->cl_cursor, FC_RED);
- return;
- }
- else if (button == MB_MENU_LEAVE)
- {
- if (leveldir_current->node_parent)
- {
- leveldir_current = leveldir_current->node_parent;
- DrawChooseLevel();
- }
- else
- {
- game_status = MAINMENU;
- DrawMainMenu();
- }
- return;
- }
-
- if (mx || my) /* mouse input */
- {
- x = (mx - SX) / 32;
- y = (my - SY) / 32 - MENU_SCREEN_START_YPOS;
- }
- else if (dx || dy) /* keyboard input */
- {
- if (dy)
- y = leveldir_current->cl_cursor + dy;
-
- if (ABS(dy) == SCR_FIELDY) /* handle KSYM_Page_Up, KSYM_Page_Down */
- {
- dy = SIGN(dy);
- step = num_page_entries - 1;
- y = (dy < 0 ? -1 : num_page_entries);
- }
- }
-
- if (x == 0 && y == -1)
- {
- if (leveldir_current->cl_first > 0 &&
- (dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY)))
- {
- leveldir_current->cl_first -= step;
- if (leveldir_current->cl_first < 0)
- leveldir_current->cl_first = 0;
-
- drawChooseLevelList(leveldir_current->cl_first, num_page_entries);
- drawChooseLevelInfo(leveldir_current->cl_first +
- leveldir_current->cl_cursor);
- drawCursor(leveldir_current->cl_cursor, FC_RED);
- AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
- leveldir_current->cl_first);
- return;
- }
- }
- else if (x == 0 && y > num_page_entries - 1)
- {
- if (leveldir_current->cl_first + num_page_entries < num_leveldirs &&
- (dy || DelayReached(&choose_delay, GADGET_FRAME_DELAY)))
- {
- leveldir_current->cl_first += step;
- if (leveldir_current->cl_first + num_page_entries > num_leveldirs)
- leveldir_current->cl_first = MAX(0, num_leveldirs - num_page_entries);
-
- drawChooseLevelList(leveldir_current->cl_first, num_page_entries);
- drawChooseLevelInfo(leveldir_current->cl_first +
- leveldir_current->cl_cursor);
- drawCursor(leveldir_current->cl_cursor, FC_RED);
- AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL,
- leveldir_current->cl_first);
- return;
- }
- }
-
- if (dx == 1)
- {
- LevelDirTree *node_first, *node_cursor;
- int leveldir_pos = leveldir_current->cl_first + y;
-
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node_cursor = getTreeInfoFromPos(node_first, leveldir_pos);
-
- if (node_cursor->node_group)
- {
- node_cursor->cl_first = leveldir_current->cl_first;
- node_cursor->cl_cursor = leveldir_current->cl_cursor;
- leveldir_current = node_cursor->node_group;
- DrawChooseLevel();
- return;
- }
- }
- else if (dx == -1 && leveldir_current->node_parent)
- {
- leveldir_current = leveldir_current->node_parent;
- DrawChooseLevel();
- return;
- }
-
- if (x == 0 && y >= 0 && y < num_page_entries)
- {
- if (button)
- {
- if (y != leveldir_current->cl_cursor)
- {
- drawCursor(y, FC_RED);
- drawCursor(leveldir_current->cl_cursor, FC_BLUE);
- drawChooseLevelInfo(leveldir_current->cl_first + y);
- leveldir_current->cl_cursor = y;
- }
- }
- else
- {
- LevelDirTree *node_first, *node_cursor;
- int leveldir_pos = leveldir_current->cl_first + y;
-
- node_first = getTreeInfoFirstGroupEntry(leveldir_current);
- node_cursor = getTreeInfoFromPos(node_first, leveldir_pos);
-
- if (node_cursor->node_group)
- {
- node_cursor->cl_first = leveldir_current->cl_first;
- node_cursor->cl_cursor = leveldir_current->cl_cursor;
- leveldir_current = node_cursor->node_group;
-
- DrawChooseLevel();
- }
- else if (node_cursor->parent_link)
- {
- leveldir_current = node_cursor->node_parent;
-
- DrawChooseLevel();
- }
- else
- {
- node_cursor->cl_first = leveldir_current->cl_first;
- node_cursor->cl_cursor = leveldir_current->cl_cursor;
- leveldir_current = node_cursor;
-
- LoadLevelSetup_SeriesInfo();
-
- SaveLevelSetup_LastSeries();
- SaveLevelSetup_SeriesInfo();
- TapeErase();
-
- game_status = MAINMENU;
- DrawMainMenu();
- }
- }
- }
-
- BackToFront();
-
- if (game_status == CHOOSELEVEL)
- DoAnimation();
-}
-
-#endif
-
-