/***********************************************************
* 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;
while (NextValidEvent(&event))
{
- switch(event.type)
+ switch (event.type)
{
case EVENT_BUTTONPRESS:
case EVENT_BUTTONRELEASE:
has its own synchronization and is CPU friendly, too */
if (game_status == GAME_MODE_PLAYING)
+ {
HandleGameActions();
+ }
else
{
SyncDisplay();
void HandleOtherEvents(Event *event)
{
- switch(event->type)
+ switch (event->type)
{
case EVENT_EXPOSE:
HandleExposeEvent((ExposeEvent *) event);
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 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)
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)
motion_status = TRUE;
- HandleButton(event->x, event->y, button_status);
+ HandleButton(event->x, event->y, button_status, button_status);
}
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);
}
CloseAllAndExit(0);
}
-void HandleButton(int mx, int my, int button)
+void HandleButton(int mx, int my, int button, int button_nr)
{
static int old_mx = 0, old_my = 0;
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:
break;
case GAME_MODE_LEVELS:
- HandleChooseLevel(mx,my, 0,0, button);
+ HandleChooseLevel(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:
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:
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
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
{
#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)
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
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 1
+ 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;
}
TapeTogglePause(TAPE_TOGGLE_MANUAL);
}
- if (game_status == GAME_MODE_PLAYING)
+ if (game_status == GAME_MODE_PLAYING && !network_playing)
{
- if (key == KSYM_5)
- game.centered_player_nr_next = -1;
+ 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 == KSYM_1 + i)
- game.centered_player_nr_next = 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);
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_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_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);
+ 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_LEVELS)
- HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE);
+ if (game_status == GAME_MODE_TITLE)
+ HandleTitleScreen(0, 0, 0, 0, MB_MENU_LEAVE);
+ else if (game_status == GAME_MODE_LEVELS)
+ 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
}
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);
- break;
-
- default:
- break;
- }
- break;
-
case GAME_MODE_EDITOR:
if (!anyTextGadgetActiveOrJustFinished || key == KSYM_Escape)
HandleLevelEditorKeyInput(key);
case GAME_MODE_PLAYING:
{
- switch(key)
+ switch (key)
{
case KSYM_Escape:
RequestQuitGame(setup.ask_on_escape);
{
if (button_status && game_status != GAME_MODE_PLAYING)
{
- HandleButton(0, 0, -button_status);
+ HandleButton(0, 0, -button_status, button_status);
+
return;
}
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_SETUP:
!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);
+ 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:
if (tape.playing || keyboard)
newbutton = ((joy & JOY_BUTTON) != 0);
+#if 1
+ if (local_player->LevelSolved_GameEnd && newbutton)
+#else
if (AllPlayersGone && newbutton)
+#endif
{
- CloseDoor(DOOR_CLOSE_1);
- game_status = GAME_MODE_MAIN;
- DrawMainMenu();
+ GameEnd();
+
return;
}