X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=2d53a4a238c9e417c2702949a330038aa702ff31;hb=a35852e106072656e444202e672d050ebff03abb;hp=6fccd1dc8be066b53ce467c6bc540c3c54167495;hpb=eae2f3467caaaf64a9370c1acd8cecf11fd58328;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 6fccd1dc..2d53a4a2 100644 --- a/src/screens.c +++ b/src/screens.c @@ -41,6 +41,20 @@ /* for HandleChooseLevel() */ #define MAX_LEVEL_SERIES_ON_SCREEN (SCR_FIELDY - 2) +/* buttons and scrollbars identifiers */ +#define SCREEN_CTRL_ID_SCROLL_UP 0 +#define SCREEN_CTRL_ID_SCROLL_DOWN 1 +#define SCREEN_CTRL_ID_SCROLL_VERTICAL 2 + +#define NUM_SCREEN_SCROLLBUTTONS 2 +#define NUM_SCREEN_SCROLLBARS 1 +#define NUM_SCREEN_GADGETS 3 + +/* forward declaration for internal use */ +static void HandleScreenGadgets(struct GadgetInfo *); + +static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; + #ifdef MSDOS extern unsigned char get_ascii(KeySym); #endif @@ -111,8 +125,8 @@ void DrawMainMenu() for(i=2; i<10; i++) DrawGraphic(0, i, GFX_KUGEL_BLAU); - DrawGraphic(10, 3, GFX_PFEIL_LEFT); - DrawGraphic(14, 3, GFX_PFEIL_RIGHT); + DrawGraphic(10, 3, GFX_ARROW_BLUE_LEFT); + DrawGraphic(14, 3, GFX_ARROW_BLUE_RIGHT); DrawText(SX + 56, SY + 326, "A Game by Artsoft Entertainment", FS_SMALL, FC_RED); @@ -815,17 +829,39 @@ void DrawChooseLevel() UnmapAllGadgets(); CloseDoor(DOOR_CLOSE_2); + ClearWindow(); + HandleChooseLevel(0,0, 0,0, MB_MENU_INITIALIZE); + MapChooseLevelGadgets(); + FadeToFront(); InitAnimation(); - HandleChooseLevel(0,0, 0,0, MB_MENU_INITIALIZE); +} + +static void AdjustChooseLevelScrollbar(int id, int first_entry) +{ + struct GadgetInfo *gi = screen_gadget[id]; + int items_max, items_visible, item_position; + + items_max = num_leveldirs; + items_visible = MAX_LEVEL_SERIES_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; + + XFillRectangle(display, backbuffer, gc, SX, SY, SXSIZE - 32, SYSIZE); + redraw_mask |= REDRAW_FIELD; - ClearWindow(); DrawText(SX, SY, "Level Directories", FS_BIG, FC_GREEN); for(i=0; i 0) - DrawGraphic(0, 1, GFX_PFEIL_UP); + DrawGraphic(0, 1, GFX_ARROW_BLUE_UP); if (first_entry + num_page_entries < num_leveldirs) - DrawGraphic(0, MAX_LEVEL_SERIES_ON_SCREEN + 1, GFX_PFEIL_DOWN); + DrawGraphic(0, MAX_LEVEL_SERIES_ON_SCREEN + 1, GFX_ARROW_BLUE_DOWN); } static void drawChooseLevelInfo(int leveldir_nr) { int x, last_redraw_mask = redraw_mask; - XFillRectangle(display, drawto, gc, SX + 32, SY + 32, SXSIZE - 32, 32); + XFillRectangle(display, drawto, gc, SX + 32, SY + 32, SXSIZE - 64, 32); #if 0 DrawTextFCentered(40, FC_RED, "%3d levels (%s)", @@ -893,8 +929,12 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) { first_entry = MAX(0, leveldir_nr - num_page_entries + 1); choice = leveldir_nr - first_entry + 3; + AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, first_entry); } + if (dx == 1) /* 'first_entry' is set by scrollbar position */ + first_entry = dy; + drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(leveldir_nr); redraw = TRUE; @@ -939,6 +979,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(first_entry + choice - 3); + AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, first_entry); DrawGraphic(0, choice - 1, GFX_KUGEL_ROT); return; } @@ -954,6 +995,7 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button) drawChooseLevelList(first_entry, num_page_entries); drawChooseLevelInfo(first_entry + choice - 3); + AdjustChooseLevelScrollbar(SCREEN_CTRL_ID_SCROLL_VERTICAL, first_entry); DrawGraphic(0, choice - 1, GFX_KUGEL_ROT); return; } @@ -1394,8 +1436,8 @@ void DrawSetupInputScreen() DrawGraphic(0, 3, GFX_KUGEL_BLAU); DrawGraphic(0, 4, GFX_KUGEL_BLAU); DrawGraphic(0, 15, GFX_KUGEL_BLAU); - DrawGraphic(10, 2, GFX_PFEIL_LEFT); - DrawGraphic(12, 2, GFX_PFEIL_RIGHT); + DrawGraphic(10, 2, GFX_ARROW_BLUE_LEFT); + DrawGraphic(12, 2, GFX_ARROW_BLUE_RIGHT); DrawText(SX+32, SY+2*32, "Player:", FS_BIG, FC_GREEN); DrawText(SX+32, SY+3*32, "Device:", FS_BIG, FC_GREEN); @@ -1475,10 +1517,10 @@ static void drawPlayerSetupInputInfo(int player_nr) } DrawText(SX+32, SY+5*32, "Actual Settings:", FS_BIG, FC_GREEN); - DrawGraphic(1, 6, GFX_PFEIL_LEFT); - DrawGraphic(1, 7, GFX_PFEIL_RIGHT); - DrawGraphic(1, 8, GFX_PFEIL_UP); - DrawGraphic(1, 9, GFX_PFEIL_DOWN); + DrawGraphic(1, 6, GFX_ARROW_BLUE_LEFT); + DrawGraphic(1, 7, GFX_ARROW_BLUE_RIGHT); + DrawGraphic(1, 8, GFX_ARROW_BLUE_UP); + DrawGraphic(1, 9, GFX_ARROW_BLUE_DOWN); DrawText(SX+2*32, SY+6*32, ":", FS_BIG, FC_BLUE); DrawText(SX+2*32, SY+7*32, ":", FS_BIG, FC_BLUE); DrawText(SX+2*32, SY+8*32, ":", FS_BIG, FC_BLUE); @@ -2050,3 +2092,223 @@ void HandleGameActions() BackToFront(); } + +/* ---------- new screen button stuff -------------------------------------- */ + +/* graphic position and size values for buttons and scrollbars */ +#define SC_SCROLLBUTTON_XPOS 64 +#define SC_SCROLLBUTTON_YPOS 0 +#define SC_SCROLLBAR_XPOS 0 +#define SC_SCROLLBAR_YPOS 64 + +#define SC_SCROLLBUTTON_XSIZE 32 +#define SC_SCROLLBUTTON_YSIZE 32 + +#define SC_SCROLL_UP_XPOS (SXSIZE - SC_SCROLLBUTTON_XSIZE) +#define SC_SCROLL_UP_YPOS SC_SCROLLBUTTON_YSIZE +#define SC_SCROLL_DOWN_XPOS SC_SCROLL_UP_XPOS +#define SC_SCROLL_DOWN_YPOS (SYSIZE - 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_VERTICAL_XSIZE SC_SCROLLBUTTON_XSIZE +#define SC_SCROLL_VERTICAL_YSIZE (SYSIZE - 3 * SC_SCROLLBUTTON_YSIZE) + +#define SC_BORDER_SIZE 14 + +static struct +{ + int xpos, ypos; + int x, y; + int gadget_id; + char *infotext; +} scrollbutton_info[NUM_SCREEN_SCROLLBUTTONS] = +{ + { + SC_SCROLLBUTTON_XPOS + 0 * SC_SCROLLBUTTON_XSIZE, SC_SCROLLBUTTON_YPOS, + SC_SCROLL_UP_XPOS, SC_SCROLL_UP_YPOS, + SCREEN_CTRL_ID_SCROLL_UP, + "scroll level series up" + }, + { + SC_SCROLLBUTTON_XPOS + 1 * SC_SCROLLBUTTON_XSIZE, SC_SCROLLBUTTON_YPOS, + SC_SCROLL_DOWN_XPOS, SC_SCROLL_DOWN_YPOS, + SCREEN_CTRL_ID_SCROLL_DOWN, + "scroll level series down" + } +}; + +static struct +{ + int xpos, ypos; + int x, y; + int width, height; + int type; + int gadget_id; + char *infotext; +} scrollbar_info[NUM_SCREEN_SCROLLBARS] = +{ + { + SC_SCROLLBAR_XPOS, SC_SCROLLBAR_YPOS, + SX + SC_SCROLL_VERTICAL_XPOS, SY + SC_SCROLL_VERTICAL_YPOS, + SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE, + GD_TYPE_SCROLLBAR_VERTICAL, + SCREEN_CTRL_ID_SCROLL_VERTICAL, + "scroll level series vertically" + } +}; + +static void CreateScreenScrollbuttons() +{ + Pixmap gd_pixmap = pix[PIX_MORE]; + struct GadgetInfo *gi; + unsigned long event_mask; + int i; + + for (i=0; icustom_id; + + if (game_status != CHOOSELEVEL) + return; + + switch (id) + { + case SCREEN_CTRL_ID_SCROLL_UP: + HandleChooseLevel(SX,SY + 32, 0,0, MB_MENU_MARK); + break; + + case SCREEN_CTRL_ID_SCROLL_DOWN: + HandleChooseLevel(SX,SY + SYSIZE - 32, 0,0, MB_MENU_MARK); + break; + + case SCREEN_CTRL_ID_SCROLL_VERTICAL: + HandleChooseLevel(0,0, 1,gi->event.item_position, MB_MENU_INITIALIZE); + break; + + default: + break; + } +}