X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=5b1e5771c671ca48ae568bdd221dd8100799966f;hp=64fda8081da0fab274d5f3008bb35369d4a5f486;hb=47da774c66f9325f9d27cddb5a697514154e2de9;hpb=6746a99c1d7348748c06d457f8496b4253bb7c84 diff --git a/src/events.c b/src/events.c index 64fda808..5b1e5771 100644 --- a/src/events.c +++ b/src/events.c @@ -378,6 +378,8 @@ void ClearPlayerAction() key_joystick_mapping = 0; for (i = 0; i < MAX_PLAYERS; i++) stored_player[i].action = 0; + + ClearJoystickState(); } void SleepWhileUnmapped() @@ -1540,9 +1542,11 @@ void HandleKey(Key key, int key_status) int i; #if defined(TARGET_SDL2) - /* map special "play/pause" media key to default key for play/pause actions */ + /* map special keys (media keys / remote control buttons) to default keys */ if (key == KSYM_PlayPause) key = KSYM_space; + else if (key == KSYM_Select) + key = KSYM_Return; #endif HandleSpecialGameControllerKeys(key, key_status); @@ -1550,10 +1554,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++) @@ -1579,22 +1580,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 @@ -1606,63 +1591,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)