cursor_inside_playfield &&
DelayReached(&special_cursor_delay, special_cursor_delay_value))
{
- if (level.game_engine_type != GAME_ENGINE_TYPE_MM)
+ if (level.game_engine_type != GAME_ENGINE_TYPE_MM ||
+ tile_cursor.enabled)
SetMouseCursor(CURSOR_PLAYFIELD);
}
}
{
int lx = getLevelFromScreenX(mx);
int ly = getLevelFromScreenY(my);
+ int new_button = (!local_player->mouse_action.button && button);
+
+ if (local_player->mouse_action.button_hint)
+ button = local_player->mouse_action.button_hint;
ClearPlayerMouseAction();
if (tape.recording && tape.pausing && tape.use_mouse)
{
- /* prevent button release or motion events from un-pausing a paused game */
- if (button && !motion_status)
- TapeTogglePause(TAPE_TOGGLE_MANUAL);
+ /* un-pause a paused game only if mouse button was newly pressed down */
+ if (new_button)
+ TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
}
+
+ SetTileCursorXY(lx, ly);
}
void SleepWhileUnmapped()
event->x, event->y);
#endif
+ // for any mouse button event, disable playfield tile cursor
+ SetTileCursorEnabled(FALSE);
+
#if defined(HAS_SCREEN_KEYBOARD)
if (video.shifted_up)
event->y += video.shifted_up_pos;
if (new_display_width != video.display_width ||
new_display_height != video.display_height)
{
+ int nr = GRID_ACTIVE_NR(); // previous screen orientation
+
video.display_width = new_display_width;
video.display_height = new_display_height;
SDLSetScreenProperties();
+
+ // check if screen orientation has changed (should always be true here)
+ if (nr != GRID_ACTIVE_NR())
+ {
+ int x, y;
+
+ if (game_status == GAME_MODE_SETUP)
+ RedrawSetupScreenAfterScreenRotation(nr);
+
+ nr = GRID_ACTIVE_NR();
+
+ overlay.grid_xsize = setup.touch.grid_xsize[nr];
+ overlay.grid_ysize = setup.touch.grid_ysize[nr];
+
+ for (x = 0; x < MAX_GRID_XSIZE; x++)
+ for (y = 0; y < MAX_GRID_YSIZE; y++)
+ overlay.grid_button[x][y] = setup.touch.grid_button[nr][x][y];
+ }
}
}
#endif
void HandleFingerEvent_VirtualButtons(FingerEvent *event)
{
+#if 1
+ int x = event->x * overlay.grid_xsize;
+ int y = event->y * overlay.grid_ysize;
+ int grid_button = overlay.grid_button[x][y];
+ int grid_button_action = GET_ACTION_FROM_GRID_BUTTON(grid_button);
+ Key key = (grid_button == CHAR_GRID_BUTTON_LEFT ? setup.input[0].key.left :
+ grid_button == CHAR_GRID_BUTTON_RIGHT ? setup.input[0].key.right :
+ grid_button == CHAR_GRID_BUTTON_UP ? setup.input[0].key.up :
+ grid_button == CHAR_GRID_BUTTON_DOWN ? setup.input[0].key.down :
+ grid_button == CHAR_GRID_BUTTON_SNAP ? setup.input[0].key.snap :
+ grid_button == CHAR_GRID_BUTTON_DROP ? setup.input[0].key.drop :
+ KSYM_UNDEFINED);
+#else
float ypos = 1.0 - 1.0 / 3.0 * video.display_width / video.display_height;
float event_x = (event->x);
float event_y = (event->y - ypos) / (1 - ypos);
event_y > 2.0 / 3.0 && event_y < 1 ?
setup.input[0].key.down :
KSYM_UNDEFINED);
+#endif
int key_status = (event->type == EVENT_FINGERRELEASE ? KEY_RELEASED :
KEY_PRESSED);
char *key_status_name = (key_status == KEY_RELEASED ? "KEY_RELEASED" :
Error(ERR_DEBUG, "::: key '%s' was '%s' [fingerId: %lld]",
getKeyNameFromKey(key), key_status_name, event->fingerId);
+ if (key_status == KEY_PRESSED)
+ overlay.grid_button_action |= grid_button_action;
+ else
+ overlay.grid_button_action &= ~grid_button_action;
+
// check if we already know this touch event's finger id
for (i = 0; i < NUM_TOUCH_FINGERS; i++)
{
return;
if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ {
+ if (strEqual(setup.touch.control_type, TOUCH_CONTROL_OFF))
+ local_player->mouse_action.button_hint =
+ (event->type == EVENT_FINGERRELEASE ? MB_NOT_PRESSED :
+ event->x < 0.5 ? MB_LEFTBUTTON :
+ event->x > 0.5 ? MB_RIGHTBUTTON :
+ MB_NOT_PRESSED);
+
return;
+ }
if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS))
HandleFingerEvent_VirtualButtons(event);
{
InsertSolutionTape();
}
+ else if (is_string_suffix(cheat_input, ":play-solution-tape") ||
+ is_string_suffix(cheat_input, ":pst"))
+ {
+ PlaySolutionTape();
+ }
else if (is_string_suffix(cheat_input, ":reload-graphics") ||
is_string_suffix(cheat_input, ":rg"))
{
DumpBrush_Small();
}
}
+
+ /* special key shortcuts for all game modes */
+ if (is_string_suffix(cheat_input, ":dump-event-actions") ||
+ is_string_suffix(cheat_input, ":dea") ||
+ is_string_suffix(cheat_input, ":DEA"))
+ {
+ DumpGadgetIdentifiers();
+ DumpScreenIdentifiers();
+ }
}
void HandleKeysDebug(Key key)
else
stored_player[pnr].action &= ~key_action;
- if (tape.single_step && tape.recording && tape.pausing)
+ if (tape.single_step && tape.recording && tape.pausing && !tape.use_mouse)
{
if (key_status == KEY_PRESSED && key_action & KEY_MOTION)
{
if (key_status == KEY_PRESSED && key_action & KEY_ACTION)
TapeTogglePause(TAPE_TOGGLE_MANUAL);
}
+
+ // for MM style levels, handle in-game keyboard input in HandleJoystick()
+ if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ joy |= key_action;
}
}
else
}
}
+static void HandleTileCursor(int dx, int dy, int button)
+{
+ if (!dx || !button)
+ ClearPlayerMouseAction();
+
+ if (!dx && !dy)
+ return;
+
+ if (button)
+ {
+ SetPlayerMouseAction(tile_cursor.x, tile_cursor.y,
+ (dx < 0 ? MB_LEFTBUTTON :
+ dx > 0 ? MB_RIGHTBUTTON : MB_RELEASED));
+ }
+ else if (!tile_cursor.moving)
+ {
+ int old_xpos = tile_cursor.xpos;
+ int old_ypos = tile_cursor.ypos;
+ int new_xpos = old_xpos;
+ int new_ypos = old_ypos;
+
+ if (IN_LEV_FIELD(old_xpos + dx, old_ypos))
+ new_xpos = old_xpos + dx;
+
+ if (IN_LEV_FIELD(old_xpos, old_ypos + dy))
+ new_ypos = old_ypos + dy;
+
+ SetTileCursorTargetXY(new_xpos, new_ypos);
+ }
+}
+
static int HandleJoystickForAllPlayers()
{
int i;
void HandleJoystick()
{
+ static unsigned int joytest_delay = 0;
+ static unsigned int joytest_delay_value = GADGET_FRAME_DELAY;
+ static int joytest_last = 0;
+ int delay_value_first = GADGET_FRAME_DELAY_FIRST;
+ int delay_value = GADGET_FRAME_DELAY;
int joystick = HandleJoystickForAllPlayers();
int keyboard = key_joystick_mapping;
int joy = (joystick | keyboard);
+ int joytest = joystick;
int left = joy & JOY_LEFT;
int right = joy & JOY_RIGHT;
int up = joy & JOY_UP;
int newbutton = (AnyJoystickButton() == JOY_BUTTON_NEW_PRESSED);
int dx = (left ? -1 : right ? 1 : 0);
int dy = (up ? -1 : down ? 1 : 0);
+ boolean use_delay_value_first = (joytest != joytest_last);
if (HandleGlobalAnimClicks(-1, -1, newbutton))
{
return;
}
+ if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ {
+ if (game_status == GAME_MODE_PLAYING)
+ {
+ // when playing MM style levels, also use delay for keyboard events
+ joytest |= keyboard;
+
+ // only use first delay value for new events, but not for changed events
+ use_delay_value_first = (!joytest != !joytest_last);
+
+ // only use delay after the initial keyboard event
+ delay_value = 0;
+ }
+
+ // for any joystick or keyboard event, enable playfield tile cursor
+ if (dx || dy || button)
+ SetTileCursorEnabled(TRUE);
+ }
+
+ if (joytest && !button && !DelayReached(&joytest_delay, joytest_delay_value))
+ {
+ /* delay joystick/keyboard actions if axes/keys continually pressed */
+ newbutton = dx = dy = 0;
+ }
+ else
+ {
+ /* first start with longer delay, then continue with shorter delay */
+ joytest_delay_value =
+ (use_delay_value_first ? delay_value_first : delay_value);
+ }
+
+ joytest_last = joytest;
+
switch (game_status)
{
case GAME_MODE_TITLE:
case GAME_MODE_INFO:
case GAME_MODE_SCORES:
{
- static unsigned int joystickmove_delay = 0;
- static unsigned int joystickmove_delay_value = GADGET_FRAME_DELAY;
- static int joystick_last = 0;
-
- if (joystick && !button &&
- !DelayReached(&joystickmove_delay, joystickmove_delay_value))
- {
- /* delay joystick actions if buttons/axes continually pressed */
- newbutton = dx = dy = 0;
- }
- else
- {
- /* start with longer delay, then continue with shorter delay */
- if (joystick != joystick_last)
- joystickmove_delay_value = GADGET_FRAME_DELAY_FIRST;
- else
- joystickmove_delay_value = GADGET_FRAME_DELAY;
- }
-
if (game_status == GAME_MODE_TITLE)
HandleTitleScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
else if (game_status == GAME_MODE_MAIN)
else if (game_status == GAME_MODE_SCORES)
HandleHallOfFame(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
- joystick_last = joystick;
-
break;
}
case GAME_MODE_PLAYING:
+#if 0
+ // !!! causes immediate GameEnd() when solving MM level with keyboard !!!
if (tape.playing || keyboard)
newbutton = ((joy & JOY_BUTTON) != 0);
+#endif
if (newbutton && AllPlayersGone)
{
return;
}
- if (tape.recording && tape.pausing)
+ if (tape.single_step && tape.recording && tape.pausing && !tape.use_mouse)
+ {
+ if (joystick & JOY_ACTION)
+ TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+ }
+ else if (tape.recording && tape.pausing && !tape.use_mouse)
{
if (joystick & JOY_ACTION)
TapeTogglePause(TAPE_TOGGLE_MANUAL);
}
+ if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ HandleTileCursor(dx, dy, button);
+
break;
default:
void HandleSpecialGameControllerButtons(Event *event)
{
#if defined(TARGET_SDL2)
+ int key_status;
+ Key key;
+
switch (event->type)
{
case SDL_CONTROLLERBUTTONDOWN:
- if (event->cbutton.button == SDL_CONTROLLER_BUTTON_START)
- HandleKey(KSYM_space, KEY_PRESSED);
- else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_BACK)
- HandleKey(KSYM_Escape, KEY_PRESSED);
-
+ key_status = KEY_PRESSED;
break;
case SDL_CONTROLLERBUTTONUP:
- if (event->cbutton.button == SDL_CONTROLLER_BUTTON_START)
- HandleKey(KSYM_space, KEY_RELEASED);
- else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_BACK)
- HandleKey(KSYM_Escape, KEY_RELEASED);
+ key_status = KEY_RELEASED;
+ break;
+
+ default:
+ return;
+ }
+
+ switch (event->cbutton.button)
+ {
+ case SDL_CONTROLLER_BUTTON_START:
+ key = KSYM_space;
+ break;
+ case SDL_CONTROLLER_BUTTON_BACK:
+ key = KSYM_Escape;
break;
+
+ default:
+ return;
}
+
+ HandleKey(key, key_status);
#endif
}