X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=e99697810143aa152f42d5f42e9cb3e771450e14;hb=14089dac2cbe56e563863e1e5adb8847944fd262;hp=0532cdd19e2f054e9d42df7059653fe2c0f40faf;hpb=fa2a77aa4b53bb786e67f35d6c46f759ebe7823d;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 0532cdd1..e9969781 100644 --- a/src/screens.c +++ b/src/screens.c @@ -27,16 +27,17 @@ /* screens in the setup menu */ #define SETUP_MODE_MAIN 0 #define SETUP_MODE_GAME 1 -#define SETUP_MODE_INPUT 2 -#define SETUP_MODE_SHORTCUT 3 -#define SETUP_MODE_GRAPHICS 4 -#define SETUP_MODE_SOUND 5 -#define SETUP_MODE_ARTWORK 6 -#define SETUP_MODE_CHOOSE_GRAPHICS 7 -#define SETUP_MODE_CHOOSE_SOUNDS 8 -#define SETUP_MODE_CHOOSE_MUSIC 9 - -#define MAX_SETUP_MODES 10 +#define SETUP_MODE_EDITOR 2 +#define SETUP_MODE_INPUT 3 +#define SETUP_MODE_SHORTCUT 4 +#define SETUP_MODE_GRAPHICS 5 +#define SETUP_MODE_SOUND 6 +#define SETUP_MODE_ARTWORK 7 +#define SETUP_MODE_CHOOSE_GRAPHICS 8 +#define SETUP_MODE_CHOOSE_SOUNDS 9 +#define SETUP_MODE_CHOOSE_MUSIC 10 + +#define MAX_SETUP_MODES 11 /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -70,31 +71,42 @@ static void HandleChooseTree(int, int, int, int, int, TreeInfo **); static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS]; static int setup_mode = SETUP_MODE_MAIN; -static void drawCursorExt(int pos, int color, int graphic) +static void drawCursorExt(int xpos, int ypos, int color, int graphic) { static int cursor_array[SCR_FIELDY]; - if (graphic) - cursor_array[pos] = graphic; - - graphic = cursor_array[pos]; + if (xpos == 0) + { + if (graphic != 0) + cursor_array[ypos] = graphic; + else + graphic = cursor_array[ypos]; + } if (color == FC_RED) graphic = (graphic == IMG_ARROW_BLUE_LEFT ? IMG_ARROW_RED_LEFT : graphic == IMG_ARROW_BLUE_RIGHT ? IMG_ARROW_RED_RIGHT : IMG_BALL_RED); - DrawGraphic(0, MENU_SCREEN_START_YPOS + pos, graphic, 0); + ypos += MENU_SCREEN_START_YPOS; + + DrawBackground(SX + xpos * 32, SY + ypos * 32, TILEX, TILEY); + DrawGraphicThruMask(xpos, ypos, graphic, 0); } -static void initCursor(int pos, int graphic) +static void initCursor(int ypos, int graphic) { - drawCursorExt(pos, FC_BLUE, graphic); + drawCursorExt(0, ypos, FC_BLUE, graphic); } -static void drawCursor(int pos, int color) +static void drawCursor(int ypos, int color) { - drawCursorExt(pos, color, 0); + drawCursorExt(0, ypos, color, 0); +} + +static void drawCursorXY(int xpos, int ypos, int graphic) +{ + drawCursorExt(xpos, ypos, -1, graphic); } void DrawHeadline() @@ -118,7 +130,7 @@ static void ToggleFullscreenIfNeeded() setup.fullscreen = video.fullscreen_enabled; /* redraw background to newly created backbuffer */ - BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer, + BlitBitmap(new_graphic_info[IMG_MENU_FRAME].bitmap, backbuffer, 0,0, WIN_XSIZE,WIN_YSIZE, 0,0); /* restore old door content */ @@ -140,6 +152,7 @@ void DrawMainMenu() KeyboardAutoRepeatOn(); ActivateJoystick(); SetDrawDeactivationMask(REDRAW_NONE); + SetBackgroundBitmap(new_graphic_info[IMG_MENU_BACKGROUND].bitmap); audio.sound_deactivated = FALSE; /* needed if last screen was the playing screen, invoked from level editor */ @@ -180,7 +193,9 @@ void DrawMainMenu() GetPlayerConfig(); LoadLevel(level_nr); + SetBackgroundBitmap(new_graphic_info[IMG_MENU_BACKGROUND].bitmap); ClearWindow(); + DrawHeadline(); DrawText(SX + 32, SY + 2*32, name_text, FS_BIG, FC_GREEN); DrawText(SX + 6*32, SY + 2*32, setup.player_name, FS_BIG, FC_RED); @@ -209,8 +224,13 @@ void DrawMainMenu() for(i=0; i<8; i++) initCursor(i, (i == 1 || i == 6 ? IMG_ARROW_BLUE_RIGHT : IMG_BALL_BLUE)); +#if 0 DrawGraphic(10, 3, IMG_ARROW_BLUE_LEFT, 0); DrawGraphic(14, 3, IMG_ARROW_BLUE_RIGHT, 0); +#else + drawCursorXY(10, 1, IMG_ARROW_BLUE_LEFT); + drawCursorXY(14, 1, IMG_ARROW_BLUE_RIGHT); +#endif DrawText(SX + 56, SY + 326, "A Game by Artsoft Entertainment", FS_SMALL, FC_RED); @@ -318,10 +338,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) level_nr = new_level_nr; - DrawTextExt(drawto, SX + 11 * 32, SY + 3 * 32, - int2str(level_nr, 3), FS_BIG, font_color); - DrawTextExt(window, SX + 11 * 32, SY + 3 * 32, - int2str(level_nr, 3), FS_BIG, font_color); + DrawText(SX + 11 * 32, SY + 3 * 32, int2str(level_nr, 3), + FS_BIG, font_color); LoadLevel(level_nr); DrawMicroLevel(MICROLEV_XPOS, MICROLEV_YPOS, TRUE); @@ -1183,8 +1201,10 @@ void HandleTypeName(int newxpos, Key key) if (newxpos) { xpos = newxpos; - DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_YELLOW); - DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0); + DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, + FS_BIG, FC_YELLOW); + drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED); + return; } @@ -1202,23 +1222,23 @@ void HandleTypeName(int newxpos, Key key) setup.player_name[xpos] = ascii; setup.player_name[xpos + 1] = 0; xpos++; - DrawTextExt(drawto, SX + 6*32, SY + ypos*32, - setup.player_name, FS_BIG, FC_YELLOW); - DrawTextExt(window, SX + 6*32, SY + ypos*32, - setup.player_name, FS_BIG, FC_YELLOW); - DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0); + + DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, + FS_BIG, FC_YELLOW); + drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED); } else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0) { xpos--; setup.player_name[xpos] = 0; - DrawGraphic(xpos + 6, ypos, IMG_BALL_RED, 0); - DrawGraphic(xpos + 7, ypos, IMG_EMPTY, 0); + + DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, 2 * TILEX, TILEY); + drawCursorXY(xpos + 6, ypos - 2, IMG_BALL_RED); } else if (key == KSYM_Return && xpos > 0) { - DrawText(SX + 6*32, SY + ypos*32, setup.player_name, FS_BIG, FC_RED); - DrawGraphic(xpos + 6, ypos, IMG_EMPTY, 0); + DrawText(SX + 6 * 32, SY + ypos * 32, setup.player_name, FS_BIG, FC_RED); + DrawBackground(SX + (xpos + 6) * 32, SY + ypos * 32, TILEX, TILEY); SaveSetup(); game_status = MAINMENU; @@ -1266,7 +1286,7 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, char *title_string = NULL; int offset = (ti->type == TREE_TYPE_LEVEL_DIR ? 0 : 16); - ClearRectangle(backbuffer, SX, SY, SXSIZE - 32, SYSIZE); + DrawBackground(SX, SY, SXSIZE - 32, SYSIZE); redraw_mask |= REDRAW_FIELD; title_string = @@ -1301,10 +1321,20 @@ static void drawChooseTreeList(int first_entry, int num_page_entries, } if (first_entry > 0) - DrawGraphic(0, 1, IMG_ARROW_BLUE_UP, 0); + { + int ypos = 1; + + DrawBackground(SX, SY + ypos * 32, TILEX, TILEY); + DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_UP, 0); + } if (first_entry + num_page_entries < num_entries) - DrawGraphic(0, MAX_MENU_ENTRIES_ON_SCREEN + 1, IMG_ARROW_BLUE_DOWN, 0); + { + int ypos = MAX_MENU_ENTRIES_ON_SCREEN + 1; + + DrawBackground(SX, SY + ypos * 32, TILEX, TILEY); + DrawGraphicThruMask(0, ypos, IMG_ARROW_BLUE_DOWN, 0); + } } static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) @@ -1318,7 +1348,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti) node_first = getTreeInfoFirstGroupEntry(ti); node = getTreeInfoFromPos(node_first, entry_pos); - ClearRectangle(drawto, SX + 32, SY + 32, SXSIZE - 64, 32); + DrawBackground(SX + 32, SY + 32, SXSIZE - 64, 32); if (node->parent_link) DrawTextFCentered(40, FC_RED, "leave group \"%s\"", node->class_desc); @@ -1670,6 +1700,12 @@ static void execSetupGame() DrawSetupScreen(); } +static void execSetupEditor() +{ + setup_mode = SETUP_MODE_EDITOR; + DrawSetupScreen(); +} + static void execSetupGraphics() { setup_mode = SETUP_MODE_GRAPHICS; @@ -1745,6 +1781,7 @@ static void execSaveAndExitSetup() static struct TokenInfo setup_info_main[] = { { TYPE_ENTER_MENU, execSetupGame, "Game Settings" }, + { TYPE_ENTER_MENU, execSetupEditor, "Editor Settings" }, { TYPE_ENTER_MENU, execSetupGraphics, "Graphics" }, { TYPE_ENTER_MENU, execSetupSound, "Sound & Music" }, { TYPE_ENTER_MENU, execSetupArtwork, "Custom Artwork" }, @@ -1752,7 +1789,7 @@ static struct TokenInfo setup_info_main[] = { TYPE_ENTER_MENU, execSetupShortcut, "Key Shortcuts" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execExitSetup, "Exit" }, - { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and exit" }, + { TYPE_LEAVE_MENU, execSaveAndExitSetup, "Save and Exit" }, { 0, NULL, NULL } }; @@ -1763,7 +1800,24 @@ static struct TokenInfo setup_info_game[] = { TYPE_SWITCH, &setup.time_limit, "Timelimit:" }, { TYPE_SWITCH, &setup.autorecord, "Auto-Record:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, + { 0, NULL, NULL } +}; + +static struct TokenInfo setup_info_editor[] = +{ + { TYPE_STRING, NULL, "Offer Special Elements:"}, + { TYPE_SWITCH, &setup.editor.el_boulderdash, "BoulderDash:" }, + { TYPE_SWITCH, &setup.editor.el_emerald_mine, "Emerald Mine:" }, + { TYPE_SWITCH, &setup.editor.el_more, "More:" }, + { TYPE_SWITCH, &setup.editor.el_sokoban, "Sokoban:" }, + { TYPE_SWITCH, &setup.editor.el_supaplex, "Supaplex:" }, + { TYPE_SWITCH, &setup.editor.el_diamond_caves, "Diamd. Caves:" }, + { TYPE_SWITCH, &setup.editor.el_dx_boulderdash,"DX Boulderd.:" }, + { TYPE_SWITCH, &setup.editor.el_chars, "Characters:" }, + { TYPE_SWITCH, &setup.editor.el_custom, "Custom:" }, + { TYPE_EMPTY, NULL, "" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1779,7 +1833,7 @@ static struct TokenInfo setup_info_graphics[] = { TYPE_SWITCH, &setup.quick_doors, "Quick Doors:" }, { TYPE_SWITCH, &setup.toons, "Toons:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1791,7 +1845,7 @@ static struct TokenInfo setup_info_sound[] = { TYPE_SWITCH, &setup.sound_loops, "Sound Loops:" }, { TYPE_SWITCH, &setup.sound_music, "Game Music:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1809,7 +1863,7 @@ static struct TokenInfo setup_info_artwork[] = { TYPE_YES_NO, &setup.override_level_sounds, "Sounds:" }, { TYPE_YES_NO, &setup.override_level_music, "Music:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1824,7 +1878,7 @@ static struct TokenInfo setup_info_shortcut[] = { TYPE_EMPTY, NULL, "" }, { TYPE_YES_NO, &setup.ask_on_escape, "Ask on Esc:" }, { TYPE_EMPTY, NULL, "" }, - { TYPE_LEAVE_MENU, execSetupMain, "Exit" }, + { TYPE_LEAVE_MENU, execSetupMain, "Back" }, { 0, NULL, NULL } }; @@ -1957,6 +2011,11 @@ static void DrawSetupScreen_Generic() setup_info = setup_info_game; title_string = "Setup Game"; } + else if (setup_mode == SETUP_MODE_EDITOR) + { + setup_info = setup_info_editor; + title_string = "Setup Editor"; + } else if (setup_mode == SETUP_MODE_GRAPHICS) { setup_info = setup_info_graphics; @@ -2020,12 +2079,18 @@ static void DrawSetupScreen_Generic() void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button) { static int choice_store[MAX_SETUP_MODES]; - int choice = choice_store[setup_mode]; + int choice = choice_store[setup_mode]; /* always starts with 0 */ int x = 0; int y = choice; if (button == MB_MENU_INITIALIZE) { + /* advance to first valid menu entry */ + while (choice < num_setup_info && + (setup_info[choice].type & TYPE_SKIP_ENTRY)) + choice++; + choice_store[setup_mode] = choice; + drawCursor(choice, FC_RED); return; } @@ -2117,12 +2182,12 @@ void DrawSetupScreen_Input() initCursor(2, IMG_ARROW_BLUE_RIGHT); initCursor(13, IMG_ARROW_BLUE_LEFT); - DrawGraphic(10, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_LEFT, 0); - DrawGraphic(12, MENU_SCREEN_START_YPOS, IMG_ARROW_BLUE_RIGHT, 0); + drawCursorXY(10, 0, IMG_ARROW_BLUE_LEFT); + drawCursorXY(12, 0, IMG_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); - DrawText(SX+32, SY+15*32, "Exit", FS_BIG, FC_GREEN); + DrawText(SX+32, SY+15*32, "Back", FS_BIG, FC_GREEN); #if 0 DeactivateJoystickForCalibration(); @@ -2184,7 +2249,7 @@ static void drawPlayerSetupInputInfo(int player_nr) custom_key = setup.input[player_nr].key; DrawText(SX+11*32, SY+2*32, int2str(player_nr + 1, 1), FS_BIG, FC_RED); - DrawGraphic(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0); + DrawGraphicThruMask(8, 2, PLAYER_NR_GFX(IMG_PLAYER1, player_nr), 0); if (setup.input[player_nr].use_joystick) { @@ -2202,10 +2267,10 @@ static void drawPlayerSetupInputInfo(int player_nr) } DrawText(SX+32, SY+5*32, "Actual Settings:", FS_BIG, FC_GREEN); - DrawGraphic(1, 6, IMG_ARROW_BLUE_LEFT, 0); - DrawGraphic(1, 7, IMG_ARROW_BLUE_RIGHT, 0); - DrawGraphic(1, 8, IMG_ARROW_BLUE_UP, 0); - DrawGraphic(1, 9, IMG_ARROW_BLUE_DOWN, 0); + drawCursorXY(1, 4, IMG_ARROW_BLUE_LEFT); + drawCursorXY(1, 5, IMG_ARROW_BLUE_RIGHT); + drawCursorXY(1, 6, IMG_ARROW_BLUE_UP); + drawCursorXY(1, 7, IMG_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); @@ -2897,6 +2962,14 @@ void CreateScreenGadgets() CreateScreenScrollbars(); } +void FreeScreenGadgets() +{ + int i; + + for (i=0; i