X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=99b55fc85824f262bc15915ce469046a5c06a88a;hb=681df696173f472fe28e49b9e8e01b34dc34629b;hp=648b035f0a9e1702dfa22fc5cfe30aed15fdca4e;hpb=41b98d9099512bb9515d97eee340172e9567ee34;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 648b035f..99b55fc8 100644 --- a/src/events.c +++ b/src/events.c @@ -40,6 +40,7 @@ static DelayCounter special_cursor_delay = { 1000 }; static boolean special_cursor_enabled = FALSE; static boolean stop_processing_events = FALSE; +static boolean is_global_anim_event = FALSE; // forward declarations for internal use @@ -1504,7 +1505,8 @@ static int HandleDropFileEvent(char *filename) Debug("event:dropfile", "filename == '%s'", filename); // check and extract dropped zip files into correct user data directory - if (!strSuffixLower(filename, ".zip")) + if (!strSuffixLower(filename, ".zip") && + !strPrefixLower(filename, "fd:")) { Warn("file '%s' not supported", filename); @@ -1551,6 +1553,15 @@ static int HandleDropFileEvent(char *filename) // add extracted level or artwork set to tree info structure AddTreeSetToTreeInfo(tree_node, directory, top_dir, tree_type); + // force restart after adding level collection + if (getTreeInfoFromIdentifier(TREE_FIRST_NODE(tree_type), top_dir) == NULL) + { + Request("Program must be restarted after adding a new level collection!", + REQ_CONFIRM); + + CloseAllAndExit(0); + } + // update menu screen (and possibly change current level set) DrawScreenAfterAddingSet(top_dir, tree_type); @@ -1605,6 +1616,12 @@ static void HandleDropCompleteEvent(int num_level_sets_succeeded, void HandleDropEvent(Event *event) { + Debug("event:drop", (event->type == SDL_DROPBEGIN ? "SDL_DROPBEGIN" : + event->type == SDL_DROPFILE ? "SDL_DROPFILE" : + event->type == SDL_DROPTEXT ? "SDL_DROPTEXT" : + event->type == SDL_DROPCOMPLETE ? "SDL_DROPCOMPLETE" : + "(unknown drop event type)")); + static boolean confirm_on_drop_complete = FALSE; static int num_level_sets_succeeded = 0; static int num_artwork_sets_succeeded = 0; @@ -1976,6 +1993,31 @@ static void HandleKeysSpecial(Key key) } } +static boolean HandleKeysSpeed(Key key, int key_status) +{ + if (game_status == GAME_MODE_PLAYING) + { + if (key == setup.shortcut.speed_fast || + key == setup.shortcut.speed_slow) + { + int speed_factor = 4; + + GameFrameDelay = (key_status != KEY_PRESSED ? setup.game_frame_delay : + key == setup.shortcut.speed_fast ? setup.game_frame_delay / speed_factor : + key == setup.shortcut.speed_slow ? setup.game_frame_delay * speed_factor : + setup.game_frame_delay); + + GameFrameDelay = MIN(MAX(1, GameFrameDelay), 1000); + + SetVideoFrameDelay(GameFrameDelay); + + return TRUE; + } + } + + return FALSE; +} + boolean HandleKeysDebug(Key key, int key_status) { #ifdef DEBUG @@ -2060,11 +2102,40 @@ void HandleKey(Key key, int key_status) { &ski.snap, NULL, DEFAULT_KEY_SNAP, JOY_BUTTON_SNAP }, { &ski.drop, NULL, DEFAULT_KEY_DROP, JOY_BUTTON_DROP } }; + boolean game_key_pressed = FALSE; int joy = 0; int i; - if (HandleKeysDebug(key, key_status)) - return; // do not handle already processed keys again + // check if any game key is pressed (direction/snap/drop keys) + if (game_status == GAME_MODE_PLAYING) + { + int pnr; + + for (pnr = 0; pnr < MAX_PLAYERS; pnr++) + { + ski = setup.input[pnr].key; + + for (i = 0; i < NUM_PLAYER_ACTIONS; i++) + if (key == *key_info[i].key_custom) + game_key_pressed = TRUE; + } + + ssi = setup.shortcut; + + for (i = 0; i < NUM_DIRECTIONS; i++) + if (key == *key_info[i].key_snap) + game_key_pressed = TRUE; + } + + // only handle speed or debug keys if no game key is pressed + if (!game_key_pressed) + { + if (HandleKeysSpeed(key, key_status)) + return; // do not handle already processed keys again + + if (HandleKeysDebug(key, key_status)) + return; // do not handle already processed keys again + } // map special keys (media keys / remote control buttons) to default keys if (key == KSYM_PlayPause) @@ -2204,6 +2275,10 @@ void HandleKey(Key key, int key_status) // reset flag to ignore repeated "key pressed" events after key release ignore_repeated_key = FALSE; + // send key release event to global animation event handling + if (!is_global_anim_event) + HandleGlobalAnimClicks(-1, -1, KEY_RELEASED, FALSE); + return; } @@ -2259,9 +2334,9 @@ void HandleKey(Key key, int key_status) } // some key events are handled like clicks for global animations - boolean click = (key == KSYM_space || - key == KSYM_Return || - key == KSYM_Escape); + boolean click = (!is_global_anim_event && (key == KSYM_space || + key == KSYM_Return || + key == KSYM_Escape)); if (click && HandleGlobalAnimClicks(-1, -1, MB_LEFTBUTTON, TRUE)) { @@ -2821,9 +2896,13 @@ boolean DoKeysymAction(int keysym) { Key key = (Key)(-keysym); + is_global_anim_event = TRUE; + HandleKey(key, KEY_PRESSED); HandleKey(key, KEY_RELEASED); + is_global_anim_event = FALSE; + return TRUE; }