X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=10950bd9513e2a993531382756a07658583c7996;hb=ff96039fa2e69d11a4fb72df8d070d4ff5477d5e;hp=6671041620077893cc02078bc6a72725057c0f64;hpb=d870b82d2c53def1ed6da9fdc46ce6bf3dd1bfae;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 66710416..10950bd9 100644 --- a/src/events.c +++ b/src/events.c @@ -128,6 +128,19 @@ static boolean SkipPressedMouseMotionEvent(const Event *event) return FALSE; } +static boolean WaitEventFiltered(Event *event) +{ + WaitEvent(event); + + if (!FilterEvents(event)) + return FALSE; + + if (SkipPressedMouseMotionEvent(event)) + return FALSE; + + return TRUE; +} + /* this is especially needed for event modifications for the Android target: if mouse coordinates should be modified in the event filter function, using a properly installed SDL event filter does not work, because in @@ -139,20 +152,8 @@ static boolean SkipPressedMouseMotionEvent(const Event *event) boolean NextValidEvent(Event *event) { while (PendingEvent()) - { - boolean handle_this_event = FALSE; - - NextEvent(event); - - if (FilterEvents(event)) - handle_this_event = TRUE; - - if (SkipPressedMouseMotionEvent(event)) - handle_this_event = FALSE; - - if (handle_this_event) + if (WaitEventFiltered(event)) return TRUE; - } return FALSE; } @@ -344,7 +345,7 @@ void ClearEventQueue() { Event event; - NextEvent(&event); + WaitEvent(&event); switch (event.type) { @@ -378,6 +379,8 @@ void ClearPlayerAction() key_joystick_mapping = 0; for (i = 0; i < MAX_PLAYERS; i++) stored_player[i].action = 0; + + ClearJoystickState(); } void SleepWhileUnmapped() @@ -390,7 +393,7 @@ void SleepWhileUnmapped() { Event event; - NextEvent(&event); + WaitEvent(&event); switch (event.type) { @@ -1273,7 +1276,7 @@ void HandleButton(int mx, int my, int button, int button_nr) if (HandleGlobalAnimClicks(mx, my, button)) { /* do not handle this button event anymore */ - mx = my = -32; /* force mouse event to be outside screen tiles */ + return; /* force mouse event not to be handled at all */ } if (button_hold && game_status == GAME_MODE_PLAYING && tape.pausing) @@ -1439,6 +1442,11 @@ static void HandleKeysSpecial(Key key) { SaveNativeLevel(&level); } + else if (is_string_suffix(cheat_input, ":frames-per-second") || + is_string_suffix(cheat_input, ":fps")) + { + global.show_frames_per_second = !global.show_frames_per_second; + } } else if (game_status == GAME_MODE_PLAYING) { @@ -1468,7 +1476,7 @@ void HandleKeysDebug(Key key) if (game_status == GAME_MODE_PLAYING || !setup.debug.frame_delay_game_only) { - boolean mod_key_pressed = (GetKeyModState() != KMOD_None); + boolean mod_key_pressed = ((GetKeyModState() & KMOD_Valid) != KMOD_None); for (i = 0; i < NUM_DEBUG_FRAME_DELAY_KEYS; i++) { @@ -1552,10 +1560,7 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_PLAYING) { /* only needed for single-step tape recording mode */ - static boolean clear_snap_button[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; - static boolean clear_drop_button[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; - static boolean element_snapped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; - static boolean element_dropped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + static boolean has_snapped[MAX_PLAYERS] = { FALSE, FALSE, FALSE, FALSE }; int pnr; for (pnr = 0; pnr < MAX_PLAYERS; pnr++) @@ -1581,22 +1586,6 @@ void HandleKey(Key key, int key_status) key_action |= key_info[i].action | JOY_BUTTON_SNAP; } - /* clear delayed snap and drop actions in single step mode (see below) */ - if (tape.single_step) - { - if (clear_snap_button[pnr]) - { - stored_player[pnr].action &= ~KEY_BUTTON_SNAP; - clear_snap_button[pnr] = FALSE; - } - - if (clear_drop_button[pnr]) - { - stored_player[pnr].action &= ~KEY_BUTTON_DROP; - clear_drop_button[pnr] = FALSE; - } - } - if (key_status == KEY_PRESSED) stored_player[pnr].action |= key_action; else @@ -1608,63 +1597,29 @@ void HandleKey(Key key, int key_status) { TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - /* if snap key already pressed, don't snap when releasing (below) */ + /* if snap key already pressed, keep pause mode when releasing */ if (stored_player[pnr].action & KEY_BUTTON_SNAP) - element_snapped[pnr] = TRUE; - - /* if drop key already pressed, don't drop when releasing (below) */ - if (stored_player[pnr].action & KEY_BUTTON_DROP) - element_dropped[pnr] = TRUE; + has_snapped[pnr] = TRUE; } else if (key_status == KEY_PRESSED && key_action & KEY_BUTTON_DROP) { - if (level.game_engine_type == GAME_ENGINE_TYPE_EM || - level.game_engine_type == GAME_ENGINE_TYPE_SP) - { - - if (level.game_engine_type == GAME_ENGINE_TYPE_SP && - getRedDiskReleaseFlag_SP() == 0) - stored_player[pnr].action &= ~KEY_BUTTON_DROP; + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + if (level.game_engine_type == GAME_ENGINE_TYPE_SP && + getRedDiskReleaseFlag_SP() == 0) + { + /* add a single inactive frame before dropping starts */ + stored_player[pnr].action &= ~KEY_BUTTON_DROP; + stored_player[pnr].force_dropping = TRUE; } } - else if (key_status == KEY_RELEASED && key_action & KEY_BUTTON) + else if (key_status == KEY_RELEASED && key_action & KEY_BUTTON_SNAP) { - if (key_action & KEY_BUTTON_SNAP) - { - /* if snap key was released without moving (see above), snap now */ - if (!element_snapped[pnr]) - { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - - stored_player[pnr].action |= KEY_BUTTON_SNAP; - - /* clear delayed snap button on next event */ - clear_snap_button[pnr] = TRUE; - } - - element_snapped[pnr] = FALSE; - } - - if (key_action & KEY_BUTTON_DROP && - level.game_engine_type == GAME_ENGINE_TYPE_RND) - { - /* if drop key was released without moving (see above), drop now */ - if (!element_dropped[pnr]) - { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - - if (level.game_engine_type != GAME_ENGINE_TYPE_SP || - getRedDiskReleaseFlag_SP() != 0) - stored_player[pnr].action |= KEY_BUTTON_DROP; - - /* clear delayed drop button on next event */ - clear_drop_button[pnr] = TRUE; - } + /* if snap key was pressed without direction, leave pause mode */ + if (!has_snapped[pnr]) + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - element_dropped[pnr] = FALSE; - } + has_snapped[pnr] = FALSE; } } else if (tape.recording && tape.pausing)