X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=8e368b613686a1331f71d396dd47c0daaef87e62;hp=66486773cdb05a79ab8f0fc82a2aa05d0f1044b7;hb=5ef9148d1f605af02e872264519eda261a3e88ca;hpb=2ea97d888cd50aaec5646c620c24601b823d581b diff --git a/src/events.c b/src/events.c index 66486773..8e368b61 100644 --- a/src/events.c +++ b/src/events.c @@ -304,7 +304,8 @@ void HandleMouseCursor() 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); } } @@ -400,6 +401,10 @@ void SetPlayerMouseAction(int mx, int my, int button) { 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(); @@ -412,10 +417,12 @@ void SetPlayerMouseAction(int mx, int my, int button) 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() @@ -482,6 +489,9 @@ void HandleButtonEvent(ButtonEvent *event) 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; @@ -626,10 +636,30 @@ void HandleWindowEvent(WindowEvent *event) 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 @@ -648,6 +678,19 @@ static struct 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); @@ -670,6 +713,7 @@ void HandleFingerEvent_VirtualButtons(FingerEvent *event) 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" : @@ -682,6 +726,11 @@ void HandleFingerEvent_VirtualButtons(FingerEvent *event) 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++) { @@ -953,7 +1002,16 @@ void HandleFingerEvent(FingerEvent *event) 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); @@ -1312,6 +1370,8 @@ static void HandleButtonOrFinger(int mx, int my, int button) HandleButtonOrFinger_WipeGestures_MM(mx, my, button); else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER)) HandleButtonOrFinger_FollowFinger_MM(mx, my, button); + else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS)) + SetPlayerMouseAction(mx, my, button); /* special case */ } else { @@ -1496,16 +1556,16 @@ void HandleButton(int mx, int my, int button, int button_nr) strEqual(setup.touch.control_type, TOUCH_CONTROL_FOLLOW_FINGER)); #endif - if (handle_gadgets && HandleGadgets(mx, my, button)) + 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 (HandleGlobalAnimClicks(mx, my, button)) + if (handle_gadgets && HandleGadgets(mx, my, button)) { /* do not handle this button event anymore */ - return; /* force mouse event not to be handled at all */ + mx = my = -32; /* force mouse event to be outside screen tiles */ } if (button_hold && game_status == GAME_MODE_PLAYING && tape.pausing) @@ -1617,6 +1677,11 @@ static void HandleKeysSpecial(Key key) { 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")) { @@ -1697,6 +1762,15 @@ static void HandleKeysSpecial(Key key) 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) @@ -1821,7 +1895,7 @@ void HandleKey(Key key, int key_status) 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) { @@ -1858,6 +1932,10 @@ void HandleKey(Key key, int key_status) 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 @@ -1955,7 +2033,7 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_MAIN && (key == setup.shortcut.toggle_pause || key == KSYM_space)) { - StartGameActions(options.network, setup.autorecord, level.random_seed); + StartGameActions(network.enabled, setup.autorecord, level.random_seed); return; } @@ -2146,10 +2224,8 @@ void HandleEventActions() HandleJoystick(); } -#if defined(NETWORK_AVALIABLE) - if (options.network) + if (network.enabled) HandleNetworking(); -#endif switch (game_status) { @@ -2166,6 +2242,37 @@ void HandleEventActions() } } +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; @@ -2201,9 +2308,15 @@ static int HandleJoystickForAllPlayers() 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; @@ -2212,6 +2325,7 @@ void HandleJoystick() 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)) { @@ -2219,6 +2333,39 @@ void HandleJoystick() 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: @@ -2229,25 +2376,6 @@ void HandleJoystick() 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) @@ -2263,14 +2391,15 @@ void HandleJoystick() 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) { @@ -2279,12 +2408,20 @@ void HandleJoystick() 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: @@ -2295,24 +2432,38 @@ void HandleJoystick() 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 } @@ -2345,3 +2496,18 @@ void HandleSpecialGameControllerKeys(Key key, int key_status) #endif #endif } + +boolean DoKeysymAction(int keysym) +{ + if (keysym < 0) + { + Key key = (Key)(-keysym); + + HandleKey(key, KEY_PRESSED); + HandleKey(key, KEY_RELEASED); + + return TRUE; + } + + return FALSE; +}