/***********************************************************
* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment *
+* (c) 1995-2006 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
#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
delay problems with lots of mouse motion events when mouse button
not pressed (X11 can handle this with 'PointerMotionHintMask') */
-int FilterMouseMotionEvents(const Event *event)
+/* event filter addition for SDL2: as SDL2 does not have a function to enable
+ or disable keyboard auto-repeat, filter repeated keyboard events instead */
+
+static int FilterEventsExt(const Event *event)
{
MotionEvent *motion;
+#if defined(TARGET_SDL2)
+ /* skip repeated key press events if keyboard auto-repeat is disabled */
+ if (event->type == EVENT_KEYPRESS &&
+ event->key.repeat &&
+ !keyrepeat_status)
+ return 0;
+#endif
+
/* non-motion events are directly passed to event handler functions */
if (event->type != EVENT_MOTIONNOTIFY)
return 1;
if (button_status == MB_RELEASED &&
game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING)
return 0;
- else
- return 1;
+
+ return 1;
+}
+
+#if defined(TARGET_SDL2)
+int FilterEvents(void *userdata, Event *event)
+{
+ return FilterEventsExt(event);
+}
+#else
+int FilterEvents(const Event *event)
+{
+ return FilterEventsExt(event);
}
+#endif
/* to prevent delay problems, skip mouse motion events if the very next
event is also a mouse motion event (and therefore effectively only
NextEvent(event);
- if (FilterMouseMotionEvents(event))
+ if (FilterEventsExt(event))
handle_this_event = TRUE;
if (SkipPressedMouseMotionEvent(event))
while (NextValidEvent(&event))
{
- switch(event.type)
+ switch (event.type)
{
case EVENT_BUTTONPRESS:
case EVENT_BUTTONRELEASE:
void HandleOtherEvents(Event *event)
{
- switch(event->type)
+ switch (event->type)
{
case EVENT_EXPOSE:
HandleExposeEvent((ExposeEvent *) event);
case SDL_JOYBUTTONUP:
HandleJoystickEvent(event);
break;
+
+ case SDL_SYSWMEVENT:
+ HandleWindowManagerEvent(event);
+ break;
#endif
default:
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:
NextEvent(&event);
- switch(event.type)
+ switch (event.type)
{
case EVENT_BUTTONRELEASE:
button_status = MB_RELEASED;
void HandleExposeEvent(ExposeEvent *event)
{
-#ifndef TARGET_SDL
+#if !defined(TARGET_SDL)
RedrawPlayfield(FALSE, event->x, event->y, event->width, event->height);
FlushDisplay();
#endif
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
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
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;
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:
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
{
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)
{
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;
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;
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)
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
{
- 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;
}
if (key_status == KEY_RELEASED)
return;
- if (key == KSYM_Return && GetKeyModState() & KMOD_Alt &&
- video.fullscreen_available)
+ 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;
}
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;
}
TapeQuickLoad();
else if (key == setup.shortcut.toggle_pause)
TapeTogglePause(TAPE_TOGGLE_MANUAL);
+
+ HandleTapeButtonKeys(key);
+ HandleSoundButtonKeys(key);
}
if (game_status == GAME_MODE_PLAYING && !network_playing)
key = KSYM_UNDEFINED;
}
- switch(game_status)
+ switch (game_status)
{
case GAME_MODE_PSEUDO_TYPENAME:
HandleTypeName(0, key);
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 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);
+ 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_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);
+ 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);
+ 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;
case GAME_MODE_PLAYING:
{
- switch(key)
+ switch (key)
{
case KSYM_Escape:
RequestQuitGame(setup.ask_on_escape);
}
break;
- case KSYM_S:
+ case KSYM_s:
if (!global.fps_slowdown)
{
global.fps_slowdown = TRUE;
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;
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_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);
+ 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:
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;
}