X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=8c7aecae91f65ec4d95c5b8880f250062120704b;hb=0d4ace80d081e080a704ee15227e209d5953e325;hp=6b501408b892bec896f7de108d3e11d9a8805d2e;hpb=24101bdeee0ac963cfd48b5220f6d9b0188a6f69;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 6b501408..8c7aecae 100644 --- a/src/events.c +++ b/src/events.c @@ -1,7 +1,7 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-2002 Artsoft Entertainment * +* (c) 1995-2006 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -24,6 +24,9 @@ #include "network.h" +#define DEBUG_EVENTS 0 + + static boolean cursor_inside_playfield = FALSE; static boolean playfield_cursor_set = FALSE; static unsigned long playfield_cursor_delay = 0; @@ -124,7 +127,7 @@ void EventLoop(void) while (NextValidEvent(&event)) { - switch(event.type) + switch (event.type) { case EVENT_BUTTONPRESS: case EVENT_BUTTONRELEASE: @@ -191,7 +194,7 @@ void EventLoop(void) void HandleOtherEvents(Event *event) { - switch(event->type) + switch (event->type) { case EVENT_EXPOSE: HandleExposeEvent((ExposeEvent *) event); @@ -220,6 +223,10 @@ void HandleOtherEvents(Event *event) case SDL_JOYBUTTONUP: HandleJoystickEvent(event); break; + + case SDL_SYSWMEVENT: + HandleWindowManagerEvent(event); + break; #endif default: @@ -235,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: @@ -274,7 +285,7 @@ void SleepWhileUnmapped() NextEvent(&event); - switch(event.type) + switch (event.type) { case EVENT_BUTTONRELEASE: button_status = MB_RELEASED; @@ -315,7 +326,7 @@ void HandleExposeEvent(ExposeEvent *event) void HandleButtonEvent(ButtonEvent *event) { -#if 0 +#if DEBUG_EVENTS printf("::: BUTTON EVENT: button %d %s\n", event->button, event->type == EVENT_BUTTONPRESS ? "pressed" : "released"); #endif @@ -350,7 +361,7 @@ void HandleKeyEvent(KeyEvent *event) Key key = GetEventKey(event, with_modifiers); Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key); -#if 0 +#if DEBUG_EVENTS printf("::: KEY EVENT: %d %s\n", GetEventKey(event, TRUE), event->type == EVENT_KEYPRESS ? "pressed" : "released"); #endif @@ -406,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; @@ -512,7 +530,7 @@ static void HandleKeysSpecial(Key key) cheat_input[cheat_input_len++] = letter; cheat_input[cheat_input_len] = '\0'; -#if 0 +#if DEBUG_EVENTS printf("::: '%s' [%d]\n", cheat_input, cheat_input_len); #endif @@ -559,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) { @@ -584,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; @@ -609,6 +634,8 @@ void HandleKey(Key key, int key_status) static boolean element_dropped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; int pnr; + ssi = setup.shortcut; + for (pnr = 0; pnr < MAX_PLAYERS; pnr++) { byte key_action = 0; @@ -616,12 +643,16 @@ 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; + for (i = 0; i < NUM_DIRECTIONS; i++) + if (key == *key_info[i].key_snap) + key_action |= key_info[i].action | JOY_BUTTON_SNAP; + if (tape.single_step && clear_button_2[pnr]) { stored_player[pnr].action &= ~KEY_BUTTON_2; @@ -660,13 +691,23 @@ void HandleKey(Key key, int key_status) element_dropped[pnr] = FALSE; } } +#if 1 + 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 else if (tape.recording && tape.pausing && (key_action & KEY_ACTION)) TapeTogglePause(TAPE_TOGGLE_MANUAL); +#endif } } 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; } @@ -687,12 +728,28 @@ void HandleKey(Key key, int key_status) if (key_status == KEY_RELEASED) return; + if ((key == KSYM_Return || key == KSYM_KP_Enter) && + (GetKeyModState() & KMOD_Alt) && video.fullscreen_available) + { + setup.fullscreen = !setup.fullscreen; + + 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 { - CloseDoor(DOOR_CLOSE_1); - game_status = GAME_MODE_MAIN; - DrawMainMenu(); + GameEnd(); return; } @@ -700,7 +757,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; } @@ -713,6 +770,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) @@ -747,7 +807,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); @@ -758,84 +818,74 @@ void HandleKey(Key key, int key_status) case GAME_MODE_LEVELS: case GAME_MODE_SETUP: case GAME_MODE_INFO: - switch(key) + case GAME_MODE_SCORES: + switch (key) { -#if 1 case KSYM_space: -#else - /* !!! only use "space" key to start game from main menu !!! */ - case KSYM_space: -#endif case KSYM_Return: if (game_status == GAME_MODE_TITLE) - HandleTitleScreen(0,0, 0,0, MB_MENU_CHOICE); + HandleTitleScreen(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_MAIN) - HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE); + HandleMainMenu(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0,0, MB_MENU_CHOICE); + HandleChooseLevel(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_SETUP) - HandleSetupScreen(0,0, 0,0, MB_MENU_CHOICE); + HandleSetupScreen(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_INFO) - HandleInfoScreen(0,0, 0,0, MB_MENU_CHOICE); + HandleInfoScreen(0, 0, 0, 0, MB_MENU_CHOICE); + else if (game_status == GAME_MODE_SCORES) + HandleHallOfFame(0, 0, 0, 0, MB_MENU_CHOICE); 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); + HandleTitleScreen(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE); + HandleChooseLevel(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_SETUP) - HandleSetupScreen(0,0, 0,0, MB_MENU_LEAVE); + HandleSetupScreen(0, 0, 0, 0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_INFO) - HandleInfoScreen(0,0, 0,0, MB_MENU_LEAVE); + HandleInfoScreen(0, 0, 0, 0, MB_MENU_LEAVE); + else if (game_status == GAME_MODE_SCORES) + HandleHallOfFame(0, 0, 0, 0, MB_MENU_LEAVE); break; case KSYM_Page_Up: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + HandleChooseLevel(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) - HandleSetupScreen(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + HandleSetupScreen(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) - HandleInfoScreen(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + HandleInfoScreen(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + else if (game_status == GAME_MODE_SCORES) + HandleHallOfFame(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); break; case KSYM_Page_Down: if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + HandleChooseLevel(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) - HandleSetupScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + HandleSetupScreen(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) - HandleInfoScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + HandleInfoScreen(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + else if (game_status == GAME_MODE_SCORES) + HandleHallOfFame(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); break; #ifdef DEBUG case KSYM_0: GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500); break; -#endif - - default: - break; - } - break; - - case GAME_MODE_SCORES: - switch(key) - { - case KSYM_space: - case KSYM_Return: - case KSYM_Escape: - game_status = GAME_MODE_MAIN; - DrawMainMenu(); - break; - case KSYM_Page_Up: - HandleHallOfFame(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); - break; - - case KSYM_Page_Down: - HandleHallOfFame(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + 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: break; @@ -849,7 +899,7 @@ void HandleKey(Key key, int key_status) case GAME_MODE_PLAYING: { - switch(key) + switch (key) { case KSYM_Escape: RequestQuitGame(setup.ask_on_escape); @@ -1014,7 +1064,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: @@ -1029,20 +1079,20 @@ void HandleJoystick() newbutton = dx = dy = 0; if (game_status == GAME_MODE_TITLE) - HandleTitleScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + HandleTitleScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_MAIN) - HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + HandleMainMenu(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + HandleChooseLevel(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_SETUP) - HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + HandleSetupScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_INFO) - HandleInfoScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + HandleInfoScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); break; } case GAME_MODE_SCORES: - HandleHallOfFame(0,0, dx,dy, !newbutton); + HandleHallOfFame(0, 0, dx, dy, !newbutton); break; case GAME_MODE_EDITOR: @@ -1053,11 +1103,14 @@ void HandleJoystick() if (tape.playing || keyboard) newbutton = ((joy & JOY_BUTTON) != 0); +#if 0 + if (local_player->LevelSolved_GameEnd && newbutton) +#else if (AllPlayersGone && newbutton) +#endif { - CloseDoor(DOOR_CLOSE_1); - game_status = GAME_MODE_MAIN; - DrawMainMenu(); + GameEnd(); + return; }