X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=cb810adf818a630034524450e07750fd77c5d028;hb=1e422c29292f0583391b0ce9e9c872b38f035ac0;hp=d42acf56eff9f1d436eef48395d162c97b1eaa9e;hpb=e05dda5c8cc6687dcbc59e182a81aed627e262d0;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index d42acf56..cb810adf 100644 --- a/src/events.c +++ b/src/events.c @@ -127,7 +127,7 @@ void EventLoop(void) while (NextValidEvent(&event)) { - switch(event.type) + switch (event.type) { case EVENT_BUTTONPRESS: case EVENT_BUTTONRELEASE: @@ -194,7 +194,7 @@ void EventLoop(void) void HandleOtherEvents(Event *event) { - switch(event->type) + switch (event->type) { case EVENT_EXPOSE: HandleExposeEvent((ExposeEvent *) event); @@ -223,6 +223,10 @@ void HandleOtherEvents(Event *event) case SDL_JOYBUTTONUP: HandleJoystickEvent(event); break; + + case SDL_SYSWMEVENT: + HandleWindowManagerEvent(event); + break; #endif default: @@ -238,14 +242,18 @@ void ClearEventQueue() NextEvent(&event); - switch(event.type) + switch (event.type) { case EVENT_BUTTONRELEASE: button_status = MB_RELEASED; break; case EVENT_KEYRELEASE: +#if 1 + ClearPlayerAction(); +#else key_joystick_mapping = 0; +#endif break; default: @@ -277,7 +285,7 @@ void SleepWhileUnmapped() NextEvent(&event); - switch(event.type) + switch (event.type) { case EVENT_BUTTONRELEASE: button_status = MB_RELEASED; @@ -409,6 +417,13 @@ void HandleClientMessageEvent(ClientMessageEvent *event) CloseAllAndExit(0); } +void HandleWindowManagerEvent(Event *event) +{ +#if defined(TARGET_SDL) + SDLHandleWindowManagerEvent(event); +#endif +} + void HandleButton(int mx, int my, int button, int button_nr) { static int old_mx = 0, old_my = 0; @@ -562,6 +577,11 @@ static void HandleKeysSpecial(Key key) { DumpTape(&tape); } + else if (is_string_suffix(cheat_input, ":save-native-level") || + is_string_suffix(cheat_input, ":snl")) + { + SaveNativeLevel(&level); + } } else if (game_status == GAME_MODE_PLAYING) { @@ -587,20 +607,22 @@ static void HandleKeysSpecial(Key key) void HandleKey(Key key, int key_status) { boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive(); - static struct SetupKeyboardInfo custom_key; + static struct SetupKeyboardInfo ski; + static struct SetupShortcutInfo ssi; static struct { Key *key_custom; + Key *key_snap; Key key_default; byte action; } key_info[] = { - { &custom_key.left, DEFAULT_KEY_LEFT, JOY_LEFT }, - { &custom_key.right, DEFAULT_KEY_RIGHT, JOY_RIGHT }, - { &custom_key.up, DEFAULT_KEY_UP, JOY_UP }, - { &custom_key.down, DEFAULT_KEY_DOWN, JOY_DOWN }, - { &custom_key.snap, DEFAULT_KEY_SNAP, JOY_BUTTON_1 }, - { &custom_key.drop, DEFAULT_KEY_DROP, JOY_BUTTON_2 } + { &ski.left, &ssi.snap_left, DEFAULT_KEY_LEFT, JOY_LEFT }, + { &ski.right, &ssi.snap_right, DEFAULT_KEY_RIGHT, JOY_RIGHT }, + { &ski.up, &ssi.snap_up, DEFAULT_KEY_UP, JOY_UP }, + { &ski.down, &ssi.snap_down, DEFAULT_KEY_DOWN, JOY_DOWN }, + { &ski.snap, NULL, DEFAULT_KEY_SNAP, JOY_BUTTON_SNAP }, + { &ski.drop, NULL, DEFAULT_KEY_DROP, JOY_BUTTON_DROP } }; int joy = 0; int i; @@ -608,7 +630,9 @@ void HandleKey(Key key, int key_status) if (game_status == GAME_MODE_PLAYING) { /* only needed for single-step tape recording mode */ - static boolean clear_button_2[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + 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 }; int pnr; @@ -619,16 +643,36 @@ void HandleKey(Key key, int key_status) if (setup.input[pnr].use_joystick) continue; - custom_key = setup.input[pnr].key; + ski = setup.input[pnr].key; - for (i = 0; i < 6; i++) + for (i = 0; i < NUM_PLAYER_ACTIONS; i++) if (key == *key_info[i].key_custom) key_action |= key_info[i].action; - if (tape.single_step && clear_button_2[pnr]) + /* use combined snap+direction keys for the first player only */ + if (pnr == 0) + { + ssi = setup.shortcut; + + for (i = 0; i < NUM_DIRECTIONS; i++) + if (key == *key_info[i].key_snap) + 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) { - stored_player[pnr].action &= ~KEY_BUTTON_2; - clear_button_2[pnr] = FALSE; + 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) @@ -638,38 +682,87 @@ void HandleKey(Key key, int key_status) if (tape.single_step && tape.recording && tape.pausing) { - if (key_status == KEY_PRESSED && - (key_action & (KEY_MOTION | KEY_BUTTON_1))) + if (key_status == KEY_PRESSED && key_action & KEY_MOTION) { TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); - if (key_action & KEY_MOTION) + /* if snap key already pressed, don't snap when releasing (below) */ + 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; + } +#if 1 + 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 (stored_player[pnr].action & KEY_BUTTON_2) - element_dropped[pnr] = TRUE; +#if 0 + printf("::: drop key pressed\n"); +#endif + + if (level.game_engine_type == GAME_ENGINE_TYPE_SP && + getRedDiskReleaseFlag_SP() == 0) + stored_player[pnr].action &= ~KEY_BUTTON_DROP; + + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); } } - else if (key_status == KEY_RELEASED && - (key_action & KEY_BUTTON_2)) +#endif + else if (key_status == KEY_RELEASED && key_action & KEY_BUTTON) { - if (!element_dropped[pnr]) + if (key_action & KEY_BUTTON_SNAP) { - TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + /* 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; - stored_player[pnr].action |= KEY_BUTTON_2; - clear_button_2[pnr] = TRUE; + /* clear delayed snap button on next event */ + clear_snap_button[pnr] = TRUE; + } + + element_snapped[pnr] = FALSE; } - element_dropped[pnr] = FALSE; +#if 1 + 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; + } + + element_dropped[pnr] = FALSE; + } +#endif } } - else if (tape.recording && tape.pausing && (key_action & KEY_ACTION)) - TapeTogglePause(TAPE_TOGGLE_MANUAL); + else if (tape.recording && tape.pausing) + { + /* prevent key release events from un-pausing a paused game */ + if (key_status == KEY_PRESSED && key_action & KEY_ACTION) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + } } } else { - for (i = 0; i < 6; i++) + for (i = 0; i < NUM_PLAYER_ACTIONS; i++) if (key == key_info[i].key_default) joy |= key_info[i].action; } @@ -697,11 +790,19 @@ void HandleKey(Key key, int key_status) ToggleFullscreenIfNeeded(); + if (game_status == GAME_MODE_SETUP) + RedrawSetupScreenAfterFullscreenToggle(); + return; } +#if 0 + if (game_status == GAME_MODE_PLAYING && local_player->LevelSolved_GameEnd && + (key == KSYM_Return || key == setup.shortcut.toggle_pause)) +#else if (game_status == GAME_MODE_PLAYING && AllPlayersGone && (key == KSYM_Return || key == setup.shortcut.toggle_pause)) +#endif { GameEnd(); @@ -711,7 +812,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, NEW_RANDOMIZE); + StartGameActions(options.network, setup.autorecord, level.random_seed); return; } @@ -724,6 +825,9 @@ void HandleKey(Key key, int key_status) TapeQuickLoad(); else if (key == setup.shortcut.toggle_pause) TapeTogglePause(TAPE_TOGGLE_MANUAL); + + HandleTapeButtonKeys(key); + HandleSoundButtonKeys(key); } if (game_status == GAME_MODE_PLAYING && !network_playing) @@ -758,7 +862,7 @@ void HandleKey(Key key, int key_status) key = KSYM_UNDEFINED; } - switch(game_status) + switch (game_status) { case GAME_MODE_PSEUDO_TYPENAME: HandleTypeName(0, key); @@ -770,7 +874,7 @@ void HandleKey(Key key, int key_status) case GAME_MODE_SETUP: case GAME_MODE_INFO: case GAME_MODE_SCORES: - switch(key) + switch (key) { case KSYM_space: case KSYM_Return: @@ -789,6 +893,9 @@ void HandleKey(Key key, int key_status) break; case KSYM_Escape: + if (game_status != GAME_MODE_MAIN) + FadeSkipNextFadeIn(); + if (game_status == GAME_MODE_TITLE) HandleTitleScreen(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_LEVELS) @@ -827,6 +934,12 @@ void HandleKey(Key key, int key_status) case KSYM_0: GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500); break; + + case KSYM_b: + setup.sp_show_border_elements = !setup.sp_show_border_elements; + printf("Supaplex border elements %s\n", + setup.sp_show_border_elements ? "enabled" : "disabled"); + break; #endif default: @@ -841,7 +954,7 @@ void HandleKey(Key key, int key_status) case GAME_MODE_PLAYING: { - switch(key) + switch (key) { case KSYM_Escape: RequestQuitGame(setup.ask_on_escape); @@ -907,17 +1020,17 @@ void HandleKey(Key key, int key_status) break; case KSYM_f: - ScrollStepSize = TILEX/8; + ScrollStepSize = TILEX / 8; printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); break; case KSYM_g: - ScrollStepSize = TILEX/4; + ScrollStepSize = TILEX / 4; printf("ScrollStepSize == %d (1/4)\n", ScrollStepSize); break; case KSYM_h: - ScrollStepSize = TILEX/2; + ScrollStepSize = TILEX / 2; printf("ScrollStepSize == %d (1/2)\n", ScrollStepSize); break; @@ -1006,7 +1119,7 @@ void HandleJoystick() int dx = (left ? -1 : right ? 1 : 0); int dy = (up ? -1 : down ? 1 : 0); - switch(game_status) + switch (game_status) { case GAME_MODE_TITLE: case GAME_MODE_MAIN: @@ -1045,7 +1158,11 @@ void HandleJoystick() if (tape.playing || keyboard) newbutton = ((joy & JOY_BUTTON) != 0); +#if 0 + if (local_player->LevelSolved_GameEnd && newbutton) +#else if (AllPlayersGone && newbutton) +#endif { GameEnd();