return FALSE;
}
+static boolean WaitValidEvent(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
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 (WaitValidEvent(event))
return TRUE;
- }
return FALSE;
}
cursor_inside_playfield &&
DelayReached(&special_cursor_delay, special_cursor_delay_value))
{
- SetMouseCursor(CURSOR_PLAYFIELD);
+ if (level.game_engine_type != GAME_ENGINE_TYPE_MM)
+ SetMouseCursor(CURSOR_PLAYFIELD);
}
}
else if (gfx.cursor_mode != CURSOR_DEFAULT)
void ClearEventQueue()
{
- while (PendingEvent())
- {
- Event event;
-
- NextEvent(&event);
+ Event event;
+ while (NextValidEvent(&event))
+ {
switch (event.type)
{
case EVENT_BUTTONRELEASE:
{
Event event;
- NextEvent(&event);
+ if (!WaitValidEvent(&event))
+ continue;
switch (event.type)
{
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)
HandleSetupScreen(mx, my, 0, 0, button);
break;
-#if defined(TARGET_SDL2)
case GAME_MODE_PLAYING:
- HandleFollowFinger(mx, my, button);
+ if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ ClickElement(mx, my, button);
+#if defined(TARGET_SDL2)
+ else
+ HandleFollowFinger(mx, my, button);
#endif
#ifdef DEBUG
- if (button == MB_PRESSED && !motion_status && IN_GFX_FIELD_PLAY(mx, my) &&
- GetKeyModState() & KMOD_Control)
+ if (button == MB_PRESSED && !motion_status && !button_hold &&
+ IN_GFX_FIELD_PLAY(mx, my) && GetKeyModState() & KMOD_Control)
DumpTileFromScreen(mx, my);
#endif
{
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)
{
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++)
{
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++)
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
{
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)
void HandleNoEvent()
{
// if (button_status && game_status != GAME_MODE_PLAYING)
- if (button_status && (game_status != GAME_MODE_PLAYING || tape.pausing))
+ if (button_status && (game_status != GAME_MODE_PLAYING ||
+ tape.pausing ||
+ level.game_engine_type == GAME_ENGINE_TYPE_MM))
{
HandleButton(0, 0, button_status, -button_status);
}