1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * (c) 1995-2002 Artsoft Entertainment *
6 * Detmolder Strasse 189 *
9 * e-mail: info@artsoft.org *
10 *----------------------------------------------------------*
12 ***********************************************************/
14 #include "libgame/libgame.h"
27 static boolean cursor_inside_playfield = FALSE;
28 static boolean playfield_cursor_set = FALSE;
29 static unsigned long playfield_cursor_delay = 0;
32 /* event filter especially needed for SDL event filtering due to
33 delay problems with lots of mouse motion events when mouse button
34 not pressed (X11 can handle this with 'PointerMotionHintMask') */
36 int FilterMouseMotionEvents(const Event *event)
40 /* non-motion events are directly passed to event handler functions */
41 if (event->type != EVENT_MOTIONNOTIFY)
44 motion = (MotionEvent *)event;
45 cursor_inside_playfield = (motion->x >= SX && motion->x < SX + SXSIZE &&
46 motion->y >= SY && motion->y < SY + SYSIZE);
48 if (game_status == GAME_MODE_PLAYING && playfield_cursor_set)
50 SetMouseCursor(CURSOR_DEFAULT);
51 playfield_cursor_set = FALSE;
52 DelayReached(&playfield_cursor_delay, 0);
55 /* skip mouse motion events without pressed button outside level editor */
56 if (button_status == MB_RELEASED &&
57 game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING)
63 /* to prevent delay problems, skip mouse motion events if the very next
64 event is also a mouse motion event (and therefore effectively only
65 handling the last of a row of mouse motion events in the event queue) */
67 boolean SkipPressedMouseMotionEvent(const Event *event)
69 /* nothing to do if the current event is not a mouse motion event */
70 if (event->type != EVENT_MOTIONNOTIFY)
73 /* only skip motion events with pressed button outside level editor */
74 if (button_status == MB_RELEASED ||
75 game_status == GAME_MODE_EDITOR || game_status == GAME_MODE_PLAYING)
82 PeekEvent(&next_event);
84 /* if next event is also a mouse motion event, skip the current one */
85 if (next_event.type == EVENT_MOTIONNOTIFY)
92 /* this is only really needed for non-SDL targets to filter unwanted events;
93 when using SDL with properly installed event filter, this function can be
94 replaced with a simple "NextEvent()" call, but it doesn't hurt either */
96 static boolean NextValidEvent(Event *event)
98 while (PendingEvent())
100 boolean handle_this_event = FALSE;
104 if (FilterMouseMotionEvents(event))
105 handle_this_event = TRUE;
107 if (SkipPressedMouseMotionEvent(event))
108 handle_this_event = FALSE;
110 if (handle_this_event)
121 if (PendingEvent()) /* got event */
125 while (NextValidEvent(&event))
129 case EVENT_BUTTONPRESS:
130 case EVENT_BUTTONRELEASE:
131 HandleButtonEvent((ButtonEvent *) &event);
134 case EVENT_MOTIONNOTIFY:
135 HandleMotionEvent((MotionEvent *) &event);
139 case EVENT_KEYRELEASE:
140 HandleKeyEvent((KeyEvent *) &event);
144 HandleOtherEvents(&event);
151 /* when playing, display a special mouse pointer inside the playfield */
152 if (game_status == GAME_MODE_PLAYING && !tape.pausing)
154 if (!playfield_cursor_set && cursor_inside_playfield &&
155 DelayReached(&playfield_cursor_delay, 1000))
157 SetMouseCursor(CURSOR_PLAYFIELD);
158 playfield_cursor_set = TRUE;
161 else if (playfield_cursor_set)
163 SetMouseCursor(CURSOR_DEFAULT);
164 playfield_cursor_set = FALSE;
170 /* don't use all CPU time when idle; the main loop while playing
171 has its own synchronization and is CPU friendly, too */
173 if (game_status == GAME_MODE_PLAYING)
180 if (!PendingEvent()) /* delay only if no pending events */
184 /* refresh window contents from drawing buffer, if needed */
187 if (game_status == GAME_MODE_QUIT)
192 void HandleOtherEvents(Event *event)
197 HandleExposeEvent((ExposeEvent *) event);
200 case EVENT_UNMAPNOTIFY:
202 /* This causes the game to stop not only when iconified, but also
203 when on another virtual desktop, which might be not desired. */
204 SleepWhileUnmapped();
210 HandleFocusEvent((FocusChangeEvent *) event);
213 case EVENT_CLIENTMESSAGE:
214 HandleClientMessageEvent((ClientMessageEvent *) event);
217 #if defined(TARGET_SDL)
218 case SDL_JOYAXISMOTION:
219 case SDL_JOYBUTTONDOWN:
220 case SDL_JOYBUTTONUP:
221 HandleJoystickEvent(event);
230 void ClearEventQueue()
232 while (PendingEvent())
240 case EVENT_BUTTONRELEASE:
241 button_status = MB_RELEASED;
244 case EVENT_KEYRELEASE:
245 key_joystick_mapping = 0;
249 HandleOtherEvents(&event);
255 void ClearPlayerAction()
259 /* simulate key release events for still pressed keys */
260 key_joystick_mapping = 0;
261 for (i = 0; i < MAX_PLAYERS; i++)
262 stored_player[i].action = 0;
265 void SleepWhileUnmapped()
267 boolean window_unmapped = TRUE;
269 KeyboardAutoRepeatOn();
271 while (window_unmapped)
279 case EVENT_BUTTONRELEASE:
280 button_status = MB_RELEASED;
283 case EVENT_KEYRELEASE:
284 key_joystick_mapping = 0;
287 case EVENT_MAPNOTIFY:
288 window_unmapped = FALSE;
291 case EVENT_UNMAPNOTIFY:
292 /* this is only to surely prevent the 'should not happen' case
293 * of recursively looping between 'SleepWhileUnmapped()' and
294 * 'HandleOtherEvents()' which usually calls this funtion.
299 HandleOtherEvents(&event);
304 if (game_status == GAME_MODE_PLAYING)
305 KeyboardAutoRepeatOffUnlessAutoplay();
308 void HandleExposeEvent(ExposeEvent *event)
311 RedrawPlayfield(FALSE, event->x, event->y, event->width, event->height);
316 void HandleButtonEvent(ButtonEvent *event)
318 motion_status = FALSE;
320 if (event->type == EVENT_BUTTONPRESS)
321 button_status = event->button;
323 button_status = MB_RELEASED;
325 HandleButton(event->x, event->y, button_status, event->button);
328 void HandleMotionEvent(MotionEvent *event)
330 if (!PointerInWindow(window))
331 return; /* window and pointer are on different screens */
333 if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR)
336 motion_status = TRUE;
338 HandleButton(event->x, event->y, button_status, button_status);
341 void HandleKeyEvent(KeyEvent *event)
343 int key_status = (event->type==EVENT_KEYPRESS ? KEY_PRESSED : KEY_RELEASED);
344 boolean with_modifiers = (game_status == GAME_MODE_PLAYING ? FALSE : TRUE);
345 Key key = GetEventKey(event, with_modifiers);
346 Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key);
348 HandleKeyModState(keymod, key_status);
349 HandleKey(key, key_status);
352 void HandleFocusEvent(FocusChangeEvent *event)
354 static int old_joystick_status = -1;
356 if (event->type == EVENT_FOCUSOUT)
358 KeyboardAutoRepeatOn();
359 old_joystick_status = joystick.status;
360 joystick.status = JOYSTICK_NOT_AVAILABLE;
364 else if (event->type == EVENT_FOCUSIN)
366 /* When there are two Rocks'n'Diamonds windows which overlap and
367 the player moves the pointer from one game window to the other,
368 a 'FocusOut' event is generated for the window the pointer is
369 leaving and a 'FocusIn' event is generated for the window the
370 pointer is entering. In some cases, it can happen that the
371 'FocusIn' event is handled by the one game process before the
372 'FocusOut' event by the other game process. In this case the
373 X11 environment would end up with activated keyboard auto repeat,
374 because unfortunately this is a global setting and not (which
375 would be far better) set for each X11 window individually.
376 The effect would be keyboard auto repeat while playing the game
377 (game_status == GAME_MODE_PLAYING), which is not desired.
378 To avoid this special case, we just wait 1/10 second before
379 processing the 'FocusIn' event.
382 if (game_status == GAME_MODE_PLAYING)
385 KeyboardAutoRepeatOffUnlessAutoplay();
388 if (old_joystick_status != -1)
389 joystick.status = old_joystick_status;
393 void HandleClientMessageEvent(ClientMessageEvent *event)
395 if (CheckCloseWindowEvent(event))
399 void HandleButton(int mx, int my, int button, int button_nr)
401 static int old_mx = 0, old_my = 0;
415 if (HandleGadgets(mx, my, button))
417 /* do not handle this button event anymore */
418 mx = my = -32; /* force mouse event to be outside screen tiles */
421 /* do not use scroll wheel button events for anything other than gadgets */
422 if (IS_WHEEL_BUTTON(button_nr))
427 case GAME_MODE_TITLE:
428 HandleTitleScreen(mx, my, 0, 0, button);
432 HandleMainMenu(mx, my, 0, 0, button);
435 case GAME_MODE_PSEUDO_TYPENAME:
436 HandleTypeName(0, KSYM_Return);
439 case GAME_MODE_LEVELS:
440 HandleChooseLevel(mx, my, 0, 0, button);
443 case GAME_MODE_SCORES:
444 HandleHallOfFame(0, 0, 0, 0, button);
447 case GAME_MODE_EDITOR:
448 HandleLevelEditorIdle();
452 HandleInfoScreen(mx, my, 0, 0, button);
455 case GAME_MODE_SETUP:
456 HandleSetupScreen(mx, my, 0, 0, button);
459 case GAME_MODE_PLAYING:
461 if (button == MB_PRESSED && !motion_status && IN_GFX_SCREEN(mx, my))
462 DumpTile(LEVELX((mx - SX) / TILEX), LEVELY((my - SY) / TILEY));
471 static boolean is_string_suffix(char *string, char *suffix)
473 int string_len = strlen(string);
474 int suffix_len = strlen(suffix);
476 if (suffix_len > string_len)
479 return (strEqual(&string[string_len - suffix_len], suffix));
482 #define MAX_CHEAT_INPUT_LEN 32
484 static void HandleKeysSpecial(Key key)
486 static char cheat_input[2 * MAX_CHEAT_INPUT_LEN + 1] = "";
487 char letter = getCharFromKey(key);
488 int cheat_input_len = strlen(cheat_input);
494 if (cheat_input_len >= 2 * MAX_CHEAT_INPUT_LEN)
496 for (i = 0; i < MAX_CHEAT_INPUT_LEN + 1; i++)
497 cheat_input[i] = cheat_input[MAX_CHEAT_INPUT_LEN + i];
499 cheat_input_len = MAX_CHEAT_INPUT_LEN;
502 cheat_input[cheat_input_len++] = letter;
503 cheat_input[cheat_input_len] = '\0';
506 printf("::: '%s' [%d]\n", cheat_input, cheat_input_len);
509 if (game_status == GAME_MODE_MAIN)
511 if (is_string_suffix(cheat_input, ":insert-solution-tape") ||
512 is_string_suffix(cheat_input, ":ist"))
514 InsertSolutionTape();
516 else if (is_string_suffix(cheat_input, ":reload-graphics") ||
517 is_string_suffix(cheat_input, ":rg"))
519 ReloadCustomArtwork(1 << ARTWORK_TYPE_GRAPHICS);
522 else if (is_string_suffix(cheat_input, ":reload-sounds") ||
523 is_string_suffix(cheat_input, ":rs"))
525 ReloadCustomArtwork(1 << ARTWORK_TYPE_SOUNDS);
528 else if (is_string_suffix(cheat_input, ":reload-music") ||
529 is_string_suffix(cheat_input, ":rm"))
531 ReloadCustomArtwork(1 << ARTWORK_TYPE_MUSIC);
534 else if (is_string_suffix(cheat_input, ":reload-artwork") ||
535 is_string_suffix(cheat_input, ":ra"))
537 ReloadCustomArtwork(1 << ARTWORK_TYPE_GRAPHICS |
538 1 << ARTWORK_TYPE_SOUNDS |
539 1 << ARTWORK_TYPE_MUSIC);
542 else if (is_string_suffix(cheat_input, ":dump-level") ||
543 is_string_suffix(cheat_input, ":dl"))
547 else if (is_string_suffix(cheat_input, ":dump-tape") ||
548 is_string_suffix(cheat_input, ":dt"))
553 else if (game_status == GAME_MODE_PLAYING)
556 if (is_string_suffix(cheat_input, ".q"))
557 DEBUG_SetMaximumDynamite();
560 else if (game_status == GAME_MODE_EDITOR)
562 if (is_string_suffix(cheat_input, ":dump-brush") ||
563 is_string_suffix(cheat_input, ":DB"))
567 else if (is_string_suffix(cheat_input, ":DDB"))
574 void HandleKey(Key key, int key_status)
576 boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive();
577 static struct SetupKeyboardInfo custom_key;
585 { &custom_key.left, DEFAULT_KEY_LEFT, JOY_LEFT },
586 { &custom_key.right, DEFAULT_KEY_RIGHT, JOY_RIGHT },
587 { &custom_key.up, DEFAULT_KEY_UP, JOY_UP },
588 { &custom_key.down, DEFAULT_KEY_DOWN, JOY_DOWN },
589 { &custom_key.snap, DEFAULT_KEY_SNAP, JOY_BUTTON_1 },
590 { &custom_key.drop, DEFAULT_KEY_DROP, JOY_BUTTON_2 }
595 if (game_status == GAME_MODE_PLAYING)
597 /* only needed for single-step tape recording mode */
598 static boolean clear_button_2[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE };
599 static boolean element_dropped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE };
602 for (pnr = 0; pnr < MAX_PLAYERS; pnr++)
606 if (setup.input[pnr].use_joystick)
609 custom_key = setup.input[pnr].key;
611 for (i = 0; i < 6; i++)
612 if (key == *key_info[i].key_custom)
613 key_action |= key_info[i].action;
615 if (tape.single_step && clear_button_2[pnr])
617 stored_player[pnr].action &= ~KEY_BUTTON_2;
618 clear_button_2[pnr] = FALSE;
621 if (key_status == KEY_PRESSED)
622 stored_player[pnr].action |= key_action;
624 stored_player[pnr].action &= ~key_action;
626 if (tape.single_step && tape.recording && tape.pausing)
628 if (key_status == KEY_PRESSED &&
629 (key_action & (KEY_MOTION | KEY_BUTTON_1)))
631 TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
633 if (key_action & KEY_MOTION)
635 if (stored_player[pnr].action & KEY_BUTTON_2)
636 element_dropped[pnr] = TRUE;
639 else if (key_status == KEY_RELEASED &&
640 (key_action & KEY_BUTTON_2))
642 if (!element_dropped[pnr])
644 TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
646 stored_player[pnr].action |= KEY_BUTTON_2;
647 clear_button_2[pnr] = TRUE;
650 element_dropped[pnr] = FALSE;
653 else if (tape.recording && tape.pausing && (key_action & KEY_ACTION))
654 TapeTogglePause(TAPE_TOGGLE_MANUAL);
659 for (i = 0; i < 6; i++)
660 if (key == key_info[i].key_default)
661 joy |= key_info[i].action;
666 if (key_status == KEY_PRESSED)
667 key_joystick_mapping |= joy;
669 key_joystick_mapping &= ~joy;
674 if (game_status != GAME_MODE_PLAYING)
675 key_joystick_mapping = 0;
677 if (key_status == KEY_RELEASED)
680 if (game_status == GAME_MODE_PLAYING && AllPlayersGone &&
681 (key == KSYM_Return || key == setup.shortcut.toggle_pause))
683 CloseDoor(DOOR_CLOSE_1);
684 game_status = GAME_MODE_MAIN;
690 if (game_status == GAME_MODE_MAIN &&
691 (key == setup.shortcut.toggle_pause || key == KSYM_space))
693 StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
698 if (game_status == GAME_MODE_MAIN || game_status == GAME_MODE_PLAYING)
700 if (key == setup.shortcut.save_game)
702 else if (key == setup.shortcut.load_game)
704 else if (key == setup.shortcut.toggle_pause)
705 TapeTogglePause(TAPE_TOGGLE_MANUAL);
708 if (game_status == GAME_MODE_PLAYING && !network_playing)
710 int centered_player_nr_next = -999;
712 if (key == setup.shortcut.focus_player_all)
713 centered_player_nr_next = -1;
715 for (i = 0; i < MAX_PLAYERS; i++)
716 if (key == setup.shortcut.focus_player[i])
717 centered_player_nr_next = i;
719 if (centered_player_nr_next != -999)
721 game.centered_player_nr_next = centered_player_nr_next;
722 game.set_centered_player = TRUE;
726 tape.centered_player_nr_next = game.centered_player_nr_next;
727 tape.set_centered_player = TRUE;
732 HandleKeysSpecial(key);
734 if (HandleGadgetsKeyInput(key))
736 if (key != KSYM_Escape) /* always allow ESC key to be handled */
737 key = KSYM_UNDEFINED;
742 case GAME_MODE_PSEUDO_TYPENAME:
743 HandleTypeName(0, key);
746 case GAME_MODE_TITLE:
748 case GAME_MODE_LEVELS:
749 case GAME_MODE_SETUP:
756 /* !!! only use "space" key to start game from main menu !!! */
760 if (game_status == GAME_MODE_TITLE)
761 HandleTitleScreen(0,0, 0,0, MB_MENU_CHOICE);
762 else if (game_status == GAME_MODE_MAIN)
763 HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE);
764 else if (game_status == GAME_MODE_LEVELS)
765 HandleChooseLevel(0,0, 0,0, MB_MENU_CHOICE);
766 else if (game_status == GAME_MODE_SETUP)
767 HandleSetupScreen(0,0, 0,0, MB_MENU_CHOICE);
768 else if (game_status == GAME_MODE_INFO)
769 HandleInfoScreen(0,0, 0,0, MB_MENU_CHOICE);
773 if (game_status == GAME_MODE_TITLE)
774 HandleTitleScreen(0,0, 0,0, MB_MENU_LEAVE);
775 else if (game_status == GAME_MODE_LEVELS)
776 HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE);
777 else if (game_status == GAME_MODE_SETUP)
778 HandleSetupScreen(0,0, 0,0, MB_MENU_LEAVE);
779 else if (game_status == GAME_MODE_INFO)
780 HandleInfoScreen(0,0, 0,0, MB_MENU_LEAVE);
784 if (game_status == GAME_MODE_LEVELS)
785 HandleChooseLevel(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
786 else if (game_status == GAME_MODE_SETUP)
787 HandleSetupScreen(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
788 else if (game_status == GAME_MODE_INFO)
789 HandleInfoScreen(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
793 if (game_status == GAME_MODE_LEVELS)
794 HandleChooseLevel(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
795 else if (game_status == GAME_MODE_SETUP)
796 HandleSetupScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
797 else if (game_status == GAME_MODE_INFO)
798 HandleInfoScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
803 GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500);
812 case GAME_MODE_SCORES:
818 game_status = GAME_MODE_MAIN;
823 HandleHallOfFame(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
827 HandleHallOfFame(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
835 case GAME_MODE_EDITOR:
836 if (!anyTextGadgetActiveOrJustFinished || key == KSYM_Escape)
837 HandleLevelEditorKeyInput(key);
840 case GAME_MODE_PLAYING:
845 RequestQuitGame(setup.ask_on_escape);
863 if (GameFrameDelay == 500)
864 GameFrameDelay = GAME_FRAME_DELAY;
866 GameFrameDelay = 500;
869 GameFrameDelay = (key - KSYM_0) * 10;
870 printf("Game speed == %d%% (%d ms delay between two frames)\n",
871 GAME_FRAME_DELAY * 100 / GameFrameDelay, GameFrameDelay);
877 options.debug = FALSE;
878 printf("debug mode disabled\n");
882 options.debug = TRUE;
883 printf("debug mode enabled\n");
888 if (!global.fps_slowdown)
890 global.fps_slowdown = TRUE;
891 global.fps_slowdown_factor = 2;
892 printf("fps slowdown enabled -- display only every 2nd frame\n");
894 else if (global.fps_slowdown_factor == 2)
896 global.fps_slowdown_factor = 4;
897 printf("fps slowdown enabled -- display only every 4th frame\n");
901 global.fps_slowdown = FALSE;
902 global.fps_slowdown_factor = 1;
903 printf("fps slowdown disabled\n");
908 ScrollStepSize = TILEX/8;
909 printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize);
913 ScrollStepSize = TILEX/4;
914 printf("ScrollStepSize == %d (1/4)\n", ScrollStepSize);
918 ScrollStepSize = TILEX/2;
919 printf("ScrollStepSize == %d (1/2)\n", ScrollStepSize);
923 ScrollStepSize = TILEX;
924 printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize);
928 printf("::: currently using game engine version %d\n",
929 game.engine_version);
940 if (key == KSYM_Escape)
942 game_status = GAME_MODE_MAIN;
952 if (button_status && game_status != GAME_MODE_PLAYING)
954 HandleButton(0, 0, -button_status, button_status);
959 #if defined(NETWORK_AVALIABLE)
967 static int HandleJoystickForAllPlayers()
972 for (i = 0; i < MAX_PLAYERS; i++)
977 if (!setup.input[i].use_joystick)
981 joy_action = Joystick(i);
982 result |= joy_action;
984 if (!setup.input[i].use_joystick)
987 stored_player[i].action = joy_action;
993 void HandleJoystick()
995 int joystick = HandleJoystickForAllPlayers();
996 int keyboard = key_joystick_mapping;
997 int joy = (joystick | keyboard);
998 int left = joy & JOY_LEFT;
999 int right = joy & JOY_RIGHT;
1000 int up = joy & JOY_UP;
1001 int down = joy & JOY_DOWN;
1002 int button = joy & JOY_BUTTON;
1003 int newbutton = (AnyJoystickButton() == JOY_BUTTON_NEW_PRESSED);
1004 int dx = (left ? -1 : right ? 1 : 0);
1005 int dy = (up ? -1 : down ? 1 : 0);
1009 case GAME_MODE_TITLE:
1010 case GAME_MODE_MAIN:
1011 case GAME_MODE_LEVELS:
1012 case GAME_MODE_SETUP:
1013 case GAME_MODE_INFO:
1015 static unsigned long joystickmove_delay = 0;
1017 if (joystick && !button &&
1018 !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY))
1019 newbutton = dx = dy = 0;
1021 if (game_status == GAME_MODE_TITLE)
1022 HandleTitleScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
1023 else if (game_status == GAME_MODE_MAIN)
1024 HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
1025 else if (game_status == GAME_MODE_LEVELS)
1026 HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
1027 else if (game_status == GAME_MODE_SETUP)
1028 HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
1029 else if (game_status == GAME_MODE_INFO)
1030 HandleInfoScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
1034 case GAME_MODE_SCORES:
1035 HandleHallOfFame(0,0, dx,dy, !newbutton);
1038 case GAME_MODE_EDITOR:
1039 HandleLevelEditorIdle();
1042 case GAME_MODE_PLAYING:
1043 if (tape.playing || keyboard)
1044 newbutton = ((joy & JOY_BUTTON) != 0);
1046 if (AllPlayersGone && newbutton)
1048 CloseDoor(DOOR_CLOSE_1);
1049 game_status = GAME_MODE_MAIN;