X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=d583d87305b3165cbc6663963f273d43391c79ae;hb=61c3da024802ecc0268bab42d7499fc0346e4fd3;hp=95b9e9f0a0e9e1b8545fb1e60eb810ebca133381;hpb=24134e1e4ef7e3d582ac4827eb8740261bf5d1b6;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 95b9e9f0..d583d873 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,9 +24,12 @@ #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; +static unsigned int playfield_cursor_delay = 0; /* event filter especially needed for SDL event filtering due to @@ -124,7 +127,7 @@ void EventLoop(void) while (NextValidEvent(&event)) { - switch(event.type) + switch (event.type) { case EVENT_BUTTONPRESS: case EVENT_BUTTONRELEASE: @@ -171,7 +174,9 @@ void EventLoop(void) has its own synchronization and is CPU friendly, too */ if (game_status == GAME_MODE_PLAYING) + { HandleGameActions(); + } else { SyncDisplay(); @@ -189,7 +194,7 @@ void EventLoop(void) void HandleOtherEvents(Event *event) { - switch(event->type) + switch (event->type) { case EVENT_EXPOSE: HandleExposeEvent((ExposeEvent *) event); @@ -218,6 +223,10 @@ void HandleOtherEvents(Event *event) case SDL_JOYBUTTONUP: HandleJoystickEvent(event); break; + + case SDL_SYSWMEVENT: + HandleWindowManagerEvent(event); + break; #endif default: @@ -233,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: @@ -272,7 +285,7 @@ void SleepWhileUnmapped() NextEvent(&event); - switch(event.type) + switch (event.type) { case EVENT_BUTTONRELEASE: button_status = MB_RELEASED; @@ -313,6 +326,11 @@ void HandleExposeEvent(ExposeEvent *event) void HandleButtonEvent(ButtonEvent *event) { +#if DEBUG_EVENTS + printf("::: BUTTON EVENT: button %d %s\n", event->button, + event->type == EVENT_BUTTONPRESS ? "pressed" : "released"); +#endif + motion_status = FALSE; if (event->type == EVENT_BUTTONPRESS) @@ -320,7 +338,7 @@ void HandleButtonEvent(ButtonEvent *event) else button_status = MB_RELEASED; - HandleButton(event->x, event->y, button_status); + HandleButton(event->x, event->y, button_status, event->button); } void HandleMotionEvent(MotionEvent *event) @@ -333,7 +351,7 @@ void HandleMotionEvent(MotionEvent *event) motion_status = TRUE; - HandleButton(event->x, event->y, button_status); + HandleButton(event->x, event->y, button_status, button_status); } void HandleKeyEvent(KeyEvent *event) @@ -343,6 +361,11 @@ void HandleKeyEvent(KeyEvent *event) Key key = GetEventKey(event, with_modifiers); Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key); +#if DEBUG_EVENTS + printf("::: KEY EVENT: %d %s\n", GetEventKey(event, TRUE), + event->type == EVENT_KEYPRESS ? "pressed" : "released"); +#endif + HandleKeyModState(keymod, key_status); HandleKey(key, key_status); } @@ -394,7 +417,14 @@ void HandleClientMessageEvent(ClientMessageEvent *event) CloseAllAndExit(0); } -void HandleButton(int mx, int my, int button) +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; @@ -416,10 +446,18 @@ void HandleButton(int mx, int my, int button) mx = my = -32; /* force mouse event to be outside screen tiles */ } - switch(game_status) + /* do not use scroll wheel button events for anything other than gadgets */ + if (IS_WHEEL_BUTTON(button_nr)) + return; + + switch (game_status) { + case GAME_MODE_TITLE: + HandleTitleScreen(mx, my, 0, 0, button); + break; + case GAME_MODE_MAIN: - HandleMainMenu(mx,my, 0,0, button); + HandleMainMenu(mx, my, 0, 0, button); break; case GAME_MODE_PSEUDO_TYPENAME: @@ -427,11 +465,15 @@ void HandleButton(int mx, int my, int button) break; case GAME_MODE_LEVELS: - HandleChooseLevel(mx,my, 0,0, button); + HandleChooseLevelSet(mx, my, 0, 0, button); + break; + + case GAME_MODE_LEVELNR: + HandleChooseLevelNr(mx, my, 0, 0, button); break; case GAME_MODE_SCORES: - HandleHallOfFame(0,0, 0,0, button); + HandleHallOfFame(0, 0, 0, 0, button); break; case GAME_MODE_EDITOR: @@ -439,11 +481,11 @@ void HandleButton(int mx, int my, int button) break; case GAME_MODE_INFO: - HandleInfoScreen(mx,my, 0,0, button); + HandleInfoScreen(mx, my, 0, 0, button); break; case GAME_MODE_SETUP: - HandleSetupScreen(mx,my, 0,0, button); + HandleSetupScreen(mx, my, 0, 0, button); break; case GAME_MODE_PLAYING: @@ -466,7 +508,7 @@ static boolean is_string_suffix(char *string, char *suffix) if (suffix_len > string_len) return FALSE; - return (strcmp(&string[string_len - suffix_len], suffix) == 0); + return (strEqual(&string[string_len - suffix_len], suffix)); } #define MAX_CHEAT_INPUT_LEN 32 @@ -492,7 +534,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 @@ -539,15 +581,17 @@ 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) { #ifdef DEBUG if (is_string_suffix(cheat_input, ".q")) - for (i = 0; i < MAX_INVENTORY_SIZE; i++) - if (local_player->inventory_size < MAX_INVENTORY_SIZE) - local_player->inventory_element[local_player->inventory_size++] = - EL_DYNAMITE; + DEBUG_SetMaximumDynamite(); #endif } else if (game_status == GAME_MODE_EDITOR) @@ -566,49 +610,73 @@ static void HandleKeysSpecial(Key key) void HandleKey(Key key, int key_status) { - int joy = 0; 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; 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; for (pnr = 0; pnr < MAX_PLAYERS; pnr++) { - int i; byte key_action = 0; 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) { - stored_player[pnr].action &= ~KEY_BUTTON_2; - clear_button_2[pnr] = FALSE; + 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) + { + 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) @@ -618,40 +686,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; + + /* clear delayed snap button on next event */ + clear_snap_button[pnr] = TRUE; + } - stored_player[pnr].action |= KEY_BUTTON_2; - clear_button_2[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 { - int i; - - 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; } @@ -672,12 +787,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; } @@ -685,7 +816,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; } @@ -698,6 +829,33 @@ 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) + { + int centered_player_nr_next = -999; + + if (key == setup.shortcut.focus_player_all) + centered_player_nr_next = -1; + else + for (i = 0; i < MAX_PLAYERS; i++) + if (key == setup.shortcut.focus_player[i]) + centered_player_nr_next = i; + + if (centered_player_nr_next != -999) + { + game.centered_player_nr_next = centered_player_nr_next; + game.set_centered_player = TRUE; + + if (tape.recording) + { + tape.centered_player_nr_next = game.centered_player_nr_next; + tape.set_centered_player = TRUE; + } + } } HandleKeysSpecial(key); @@ -708,82 +866,94 @@ void HandleKey(Key key, int key_status) key = KSYM_UNDEFINED; } - switch(game_status) + switch (game_status) { case GAME_MODE_PSEUDO_TYPENAME: HandleTypeName(0, key); break; + case GAME_MODE_TITLE: case GAME_MODE_MAIN: case GAME_MODE_LEVELS: + case GAME_MODE_LEVELNR: case GAME_MODE_SETUP: case GAME_MODE_INFO: - switch(key) + case GAME_MODE_SCORES: + switch (key) { -#if 0 - /* !!! only use "space" key to start game from main menu !!! */ case KSYM_space: -#endif case KSYM_Return: - if (game_status == GAME_MODE_MAIN) - HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE); + if (game_status == GAME_MODE_TITLE) + HandleTitleScreen(0, 0, 0, 0, MB_MENU_CHOICE); + else if (game_status == GAME_MODE_MAIN) + HandleMainMenu(0, 0, 0, 0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_LEVELS) - HandleChooseLevel(0,0, 0,0, MB_MENU_CHOICE); + HandleChooseLevelSet(0, 0, 0, 0, MB_MENU_CHOICE); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(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_LEVELS) - HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE); + 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) + HandleChooseLevelSet(0, 0, 0, 0, MB_MENU_LEAVE); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(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); + HandleChooseLevelSet(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(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); + HandleChooseLevelSet(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(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); - break; - - default: - break; - } - break; - - case GAME_MODE_SCORES: - switch(key) - { - case KSYM_space: - case KSYM_Return: - case KSYM_Escape: - game_status = GAME_MODE_MAIN; - DrawMainMenu(); + 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_Up: - HandleHallOfFame(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK); +#ifdef DEBUG + case KSYM_0: + GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500); 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; @@ -797,7 +967,7 @@ void HandleKey(Key key, int key_status) case GAME_MODE_PLAYING: { - switch(key) + switch (key) { case KSYM_Escape: RequestQuitGame(setup.ask_on_escape); @@ -805,6 +975,7 @@ void HandleKey(Key key, int key_status) #ifdef DEBUG case KSYM_0: +#if 0 case KSYM_1: case KSYM_2: case KSYM_3: @@ -814,6 +985,7 @@ void HandleKey(Key key, int key_status) case KSYM_7: case KSYM_8: case KSYM_9: +#endif if (key == KSYM_0) { if (GameFrameDelay == 500) @@ -840,7 +1012,7 @@ void HandleKey(Key key, int key_status) } break; - case KSYM_S: + case KSYM_s: if (!global.fps_slowdown) { global.fps_slowdown = TRUE; @@ -861,17 +1033,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; @@ -907,7 +1079,8 @@ void HandleNoEvent() { if (button_status && game_status != GAME_MODE_PLAYING) { - HandleButton(0, 0, -button_status); + HandleButton(0, 0, -button_status, button_status); + return; } @@ -959,32 +1132,38 @@ 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: case GAME_MODE_LEVELS: + case GAME_MODE_LEVELNR: case GAME_MODE_SETUP: case GAME_MODE_INFO: { - static unsigned long joystickmove_delay = 0; + static unsigned int joystickmove_delay = 0; if (joystick && !button && !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY)) newbutton = dx = dy = 0; - if (game_status == GAME_MODE_MAIN) - HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + 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) + 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); + HandleChooseLevelSet(0,0,dx,dy,newbutton?MB_MENU_CHOICE : MB_MENU_MARK); + else if (game_status == GAME_MODE_LEVELNR) + HandleChooseLevelNr(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: @@ -995,11 +1174,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; }