X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=6757061efb78766868ebd0b08f354ca4073d4aca;hb=9fa601d400aa71f38fcdc19eaf107f42e0d2a2a3;hp=4ae7ac786e50266add635f325f26463f70dfaf15;hpb=50f0681cf3069e35f434c03825ad56bd80dabcbf;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index 4ae7ac78..6757061e 100644 --- a/src/screens.c +++ b/src/screens.c @@ -60,20 +60,21 @@ /* sub-screens on the setup screen (specific) */ #define SETUP_MODE_CHOOSE_GAME_SPEED 16 #define SETUP_MODE_CHOOSE_SCROLL_DELAY 17 -#define SETUP_MODE_CHOOSE_SCREEN_MODE 18 -#define SETUP_MODE_CHOOSE_WINDOW_SIZE 19 -#define SETUP_MODE_CHOOSE_SCALING_TYPE 20 -#define SETUP_MODE_CHOOSE_GRAPHICS 21 -#define SETUP_MODE_CHOOSE_SOUNDS 22 -#define SETUP_MODE_CHOOSE_MUSIC 23 -#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE 24 -#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 25 -#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 26 -#define SETUP_MODE_CHOOSE_TOUCH_CONTROL 27 -#define SETUP_MODE_CHOOSE_MOVE_DISTANCE 28 -#define SETUP_MODE_CHOOSE_DROP_DISTANCE 29 - -#define MAX_SETUP_MODES 30 +#define SETUP_MODE_CHOOSE_SNAPSHOT_MODE 18 +#define SETUP_MODE_CHOOSE_SCREEN_MODE 19 +#define SETUP_MODE_CHOOSE_WINDOW_SIZE 20 +#define SETUP_MODE_CHOOSE_SCALING_TYPE 21 +#define SETUP_MODE_CHOOSE_GRAPHICS 22 +#define SETUP_MODE_CHOOSE_SOUNDS 23 +#define SETUP_MODE_CHOOSE_MUSIC 24 +#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE 25 +#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 26 +#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 27 +#define SETUP_MODE_CHOOSE_TOUCH_CONTROL 28 +#define SETUP_MODE_CHOOSE_MOVE_DISTANCE 29 +#define SETUP_MODE_CHOOSE_DROP_DISTANCE 30 + +#define MAX_SETUP_MODES 31 /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 @@ -201,6 +202,9 @@ static TreeInfo *scaling_type_current = NULL; static TreeInfo *scroll_delays = NULL; static TreeInfo *scroll_delay_current = NULL; +static TreeInfo *snapshot_modes = NULL; +static TreeInfo *snapshot_mode_current = NULL; + static TreeInfo *game_speeds = NULL; static TreeInfo *game_speed_current = NULL; @@ -310,6 +314,19 @@ static struct { -1, NULL }, }; +static struct +{ + char *value; + char *text; +} snapshot_modes_list[] = +{ + { STR_SNAPSHOT_MODE_OFF, "Off" }, + { STR_SNAPSHOT_MODE_EVERY_STEP, "Every Step" }, + { STR_SNAPSHOT_MODE_EVERY_MOVE, "Every Move" }, + + { NULL, NULL }, +}; + static struct { int value; @@ -1006,8 +1023,24 @@ static void InitializeMainControls() } } +static void DrawPressedGraphicThruMask(int dst_x, int dst_y, + int graphic, boolean pressed) +{ + struct GraphicInfo *g = &graphic_info[graphic]; + Bitmap *src_bitmap; + int src_x, src_y; + int xoffset = (pressed ? g->pressed_xoffset : 0); + int yoffset = (pressed ? g->pressed_yoffset : 0); + + getFixedGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + + BlitBitmapMasked(src_bitmap, drawto, src_x + xoffset, src_y + yoffset, + g->width, g->height, dst_x, dst_y); +} + static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, - boolean active_input) + boolean active_input, + boolean pressed_button) { int i; @@ -1044,7 +1077,7 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, int y = mSY + pos->y; DrawBackgroundForGraphic(x, y, pos->width, pos->height, button_graphic); - DrawFixedGraphicThruMaskExt(drawto, x, y, button_graphic, 0); + DrawPressedGraphicThruMask(x, y, button_graphic, pressed_button); } if (visibleTextPos(pos_text) && text != NULL) @@ -1076,15 +1109,17 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text, } } -static void DrawCursorAndText_Main(int nr, boolean active_text) +static void DrawCursorAndText_Main(int nr, boolean active_text, + boolean pressed_button) { - DrawCursorAndText_Main_Ext(nr, active_text, FALSE); + DrawCursorAndText_Main_Ext(nr, active_text, FALSE, pressed_button); } #if 0 -static void DrawCursorAndText_Main_Input(int nr, boolean active_text) +static void DrawCursorAndText_Main_Input(int nr, boolean active_text, + boolean pressed_button) { - DrawCursorAndText_Main_Ext(nr, active_text, TRUE); + DrawCursorAndText_Main_Ext(nr, active_text, TRUE, pressed_button); } #endif @@ -1386,7 +1421,7 @@ void DrawMainMenuExt(int fade_mask, boolean do_fading) InitializeMainControls(); - DrawCursorAndText_Main(-1, FALSE); + DrawCursorAndText_Main(-1, FALSE, FALSE); DrawPreviewLevelInitial(); HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE); @@ -1693,12 +1728,14 @@ void HandleMainMenu_SelectLevel(int step, int direction, int selected_level_nr) void HandleMainMenu(int mx, int my, int dx, int dy, int button) { static int choice = MAIN_CONTROL_GAME; + static boolean button_pressed_last = FALSE; + boolean button_pressed = FALSE; int pos = choice; int i; if (button == MB_MENU_INITIALIZE) { - DrawCursorAndText_Main(choice, TRUE); + DrawCursorAndText_Main(choice, TRUE, FALSE); return; } @@ -1718,6 +1755,16 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) break; } } + + // handle pressed/unpressed state for active/inactive menu buttons + // (if pos != -1, "i" contains index position corresponding to "pos") + if (button && + pos >= MAIN_CONTROL_NAME && pos <= MAIN_CONTROL_QUIT && + insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY)) + button_pressed = TRUE; + + if (button_pressed != button_pressed_last) + DrawCursorAndText_Main(choice, TRUE, button_pressed); } else if (dx || dy) /* keyboard input */ { @@ -1756,8 +1803,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) { PlaySound(SND_MENU_ITEM_ACTIVATING); - DrawCursorAndText_Main(choice, FALSE); - DrawCursorAndText_Main(pos, TRUE); + DrawCursorAndText_Main(choice, FALSE, FALSE); + DrawCursorAndText_Main(pos, TRUE, button_pressed); choice = pos; } @@ -1844,6 +1891,8 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button) } } } + + button_pressed_last = button_pressed; } @@ -3258,6 +3307,15 @@ static void DrawChooseTree(TreeInfo **ti_ptr) { int fade_mask = (DrawingAreaChanged() ? REDRAW_ALL : REDRAW_FIELD); + if (strEqual((*ti_ptr)->subdir, STRING_TOP_DIRECTORY)) + { + game_status = GAME_MODE_MAIN; + + DrawMainMenuExt(REDRAW_FIELD, FALSE); + + return; + } + UnmapAllGadgets(); FreeScreenGadgets(); @@ -3463,7 +3521,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, else if (game_status == GAME_MODE_SETUP) { if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED || - setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) + setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY || + setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE) execSetupGame(); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE || setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE || @@ -3555,7 +3614,6 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, ti->cl_first, ti); } - return; } @@ -3661,7 +3719,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, if (game_status == GAME_MODE_SETUP) { if (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED || - setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) + setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY || + setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE) execSetupGame(); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE || setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE || @@ -3924,6 +3983,7 @@ static char *screen_mode_text; static char *window_size_text; static char *scaling_type_text; static char *scroll_delay_text; +static char *snapshot_mode_text; static char *game_speed_text; static char *graphics_set_name; static char *sounds_set_name; @@ -4042,10 +4102,61 @@ static void execSetupGame_setScrollDelays() scroll_delay_text = scroll_delay_current->name; } +static void execSetupGame_setSnapshotModes() +{ + if (snapshot_modes == NULL) + { + int i; + + for (i = 0; snapshot_modes_list[i].value != NULL; i++) + { + TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED); + char identifier[32], name[32]; + char *value = snapshot_modes_list[i].value; + char *text = snapshot_modes_list[i].text; + + ti->node_top = &snapshot_modes; + ti->sort_priority = i; + + sprintf(identifier, "%s", value); + sprintf(name, "%s", text); + + setString(&ti->identifier, identifier); + setString(&ti->name, name); + setString(&ti->name_sorting, name); + setString(&ti->infotext, "Snapshot Mode"); + + pushTreeInfo(&snapshot_modes, ti); + } + + /* sort snapshot mode values to start with lowest snapshot mode value */ + sortTreeInfo(&snapshot_modes); + + /* set current snapshot mode value to configured snapshot mode value */ + snapshot_mode_current = + getTreeInfoFromIdentifier(snapshot_modes, setup.engine_snapshot_mode); + + /* if that fails, set current snapshot mode to reliable default value */ + if (snapshot_mode_current == NULL) + snapshot_mode_current = + getTreeInfoFromIdentifier(snapshot_modes, STR_SNAPSHOT_MODE_DEFAULT); + + /* if that also fails, set current snapshot mode to first available value */ + if (snapshot_mode_current == NULL) + snapshot_mode_current = snapshot_modes; + } + + setup.engine_snapshot_mode = snapshot_mode_current->identifier; + + /* needed for displaying snapshot mode text instead of identifier */ + snapshot_mode_text = snapshot_mode_current->name; +} + static void execSetupGame() { execSetupGame_setGameSpeeds(); execSetupGame_setScrollDelays(); + execSetupGame_setSnapshotModes(); setup_mode = SETUP_MODE_GAME; @@ -4066,6 +4177,13 @@ static void execSetupChooseScrollDelay() DrawSetupScreen(); } +static void execSetupChooseSnapshotMode() +{ + setup_mode = SETUP_MODE_CHOOSE_SNAPSHOT_MODE; + + DrawSetupScreen(); +} + static void execSetupEditor() { setup_mode = SETUP_MODE_EDITOR; @@ -4879,6 +4997,8 @@ static struct TokenInfo setup_info_game[] = { TYPE_ENTER_LIST, execSetupChooseScrollDelay, "Scroll Delay:" }, { TYPE_STRING, &scroll_delay_text, "" }, #endif + { TYPE_ENTER_LIST, execSetupChooseSnapshotMode,"Game Engine Snapshot Mode:" }, + { TYPE_STRING, &snapshot_mode_text, "" }, { TYPE_EMPTY, NULL, "" }, { TYPE_LEAVE_MENU, execSetupMain, "Back" }, @@ -6394,6 +6514,8 @@ void DrawSetupScreen() DrawChooseTree(&game_speed_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) DrawChooseTree(&scroll_delay_current); + else if (setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE) + DrawChooseTree(&snapshot_mode_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) DrawChooseTree(&screen_mode_current); else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE) @@ -6445,6 +6567,8 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) HandleChooseTree(mx, my, dx, dy, button, &game_speed_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY) HandleChooseTree(mx, my, dx, dy, button, &scroll_delay_current); + else if (setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE) + HandleChooseTree(mx, my, dx, dy, button, &snapshot_mode_current); else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE) HandleChooseTree(mx, my, dx, dy, button, &screen_mode_current); else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE)