}
/* skip mouse motion events without pressed button outside level editor */
- if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR &&
- game_status != GAME_MODE_PLAYING)
+ if (button_status == MB_RELEASED &&
+ game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING)
return 0;
else
return 1;
}
+/* to prevent delay problems, skip mouse motion events if the very next
+ event is also a mouse motion event (and therefore effectively only
+ handling the last of a row of mouse motion events in the event queue) */
+
+boolean SkipPressedMouseMotionEvent(const Event *event)
+{
+ /* nothing to do if the current event is not a mouse motion event */
+ if (event->type != EVENT_MOTIONNOTIFY)
+ return FALSE;
+
+ /* only skip motion events with pressed button outside level editor */
+ if (button_status == MB_RELEASED ||
+ game_status == GAME_MODE_EDITOR || game_status == GAME_MODE_PLAYING)
+ return FALSE;
+
+ if (PendingEvent())
+ {
+ Event next_event;
+
+ PeekEvent(&next_event);
+
+ /* if next event is also a mouse motion event, skip the current one */
+ if (next_event.type == EVENT_MOTIONNOTIFY)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
/* this is only really needed for non-SDL targets to filter unwanted events;
when using SDL with properly installed event filter, this function can be
replaced with a simple "NextEvent()" call, but it doesn't hurt either */
{
while (PendingEvent())
{
+ boolean handle_this_event = FALSE;
+
NextEvent(event);
if (FilterMouseMotionEvents(event))
+ handle_this_event = TRUE;
+
+ if (SkipPressedMouseMotionEvent(event))
+ handle_this_event = FALSE;
+
+ if (handle_this_event)
return TRUE;
}
{
Event event;
- if (NextValidEvent(&event))
+ while (NextValidEvent(&event))
{
switch(event.type)
{
else
{
/* when playing, display a special mouse pointer inside the playfield */
- if (game_status == GAME_MODE_PLAYING)
+ if (game_status == GAME_MODE_PLAYING && !tape.pausing)
{
if (!playfield_cursor_set && cursor_inside_playfield &&
DelayReached(&playfield_cursor_delay, 1000))
has its own synchronization and is CPU friendly, too */
if (game_status == GAME_MODE_PLAYING)
+ {
HandleGameActions();
+ }
else
{
SyncDisplay();
if (!PointerInWindow(window))
return; /* window and pointer are on different screens */
-#if 1
if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR)
return;
-#endif
motion_status = TRUE;
Delay(100);
KeyboardAutoRepeatOffUnlessAutoplay();
}
+
if (old_joystick_status != -1)
joystick.status = old_joystick_status;
}
switch(game_status)
{
+ case GAME_MODE_TITLE:
+ HandleTitleScreen(mx,my, 0,0, button);
+ break;
+
case GAME_MODE_MAIN:
HandleMainMenu(mx,my, 0,0, button);
break;
break;
case GAME_MODE_EDITOR:
+ HandleLevelEditorIdle();
break;
case GAME_MODE_INFO:
case GAME_MODE_PLAYING:
#ifdef DEBUG
- if (button == MB_RELEASED)
- {
- if (IN_GFX_SCREEN(mx, my))
- {
- int sx = (mx - SX) / TILEX;
- int sy = (my - SY) / TILEY;
- int x = LEVELX(sx);
- int y = LEVELY(sy);
-
- printf("INFO: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
-
- if (!IN_LEV_FIELD(x, y))
- break;
-
- printf(" Feld[%d][%d] == %d ('%s')\n", x,y, Feld[x][y],
- element_info[Feld[x][y]].token_name);
- printf(" Back[%d][%d] == %d\n", x,y, Back[x][y]);
- printf(" Store[%d][%d] == %d\n", x,y, Store[x][y]);
- printf(" Store2[%d][%d] == %d\n", x,y, Store2[x][y]);
- printf(" StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]);
- printf(" MovPos[%d][%d] == %d\n", x,y, MovPos[x][y]);
- printf(" MovDir[%d][%d] == %d\n", x,y, MovDir[x][y]);
- printf(" MovDelay[%d][%d] == %d\n", x,y, MovDelay[x][y]);
- printf(" ChangeDelay[%d][%d] == %d\n", x,y, ChangeDelay[x][y]);
- printf(" GfxElement[%d][%d] == %d\n", x,y, GfxElement[x][y]);
- printf(" GfxAction[%d][%d] == %d\n", x,y, GfxAction[x][y]);
- printf(" GfxFrame[%d][%d] == %d\n", x,y, GfxFrame[x][y]);
- printf("\n");
- }
- }
+ if (button == MB_PRESSED && !motion_status && IN_GFX_SCREEN(mx, my))
+ DumpTile(LEVELX((mx - SX) / TILEX), LEVELY((my - SY) / TILEY));
#endif
break;
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
-static void HandleKeysCheating(Key key)
+static void HandleKeysSpecial(Key key)
{
static char cheat_input[2 * MAX_CHEAT_INPUT_LEN + 1] = "";
char letter = getCharFromKey(key);
{
#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)
+ {
+ if (is_string_suffix(cheat_input, ":dump-brush") ||
+ is_string_suffix(cheat_input, ":DB"))
+ {
+ DumpBrush();
+ }
+ else if (is_string_suffix(cheat_input, ":DDB"))
+ {
+ DumpBrush_Small();
+ }
+ }
}
void HandleKey(Key key, int key_status)
{
- int joy = 0;
boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive();
static struct SetupKeyboardInfo custom_key;
static struct
{ &custom_key.snap, DEFAULT_KEY_SNAP, JOY_BUTTON_1 },
{ &custom_key.drop, DEFAULT_KEY_DROP, JOY_BUTTON_2 }
};
+ int joy = 0;
+ int i;
if (game_status == GAME_MODE_PLAYING)
{
for (pnr = 0; pnr < MAX_PLAYERS; pnr++)
{
- int i;
byte key_action = 0;
if (setup.input[pnr].use_joystick)
}
else
{
- int i;
-
for (i = 0; i < 6; i++)
if (key == key_info[i].key_default)
joy |= key_info[i].action;
return;
}
- if (game_status == GAME_MODE_MAIN && key == setup.shortcut.toggle_pause)
+ if (game_status == GAME_MODE_MAIN &&
+ (key == setup.shortcut.toggle_pause || key == KSYM_space))
{
- if (setup.autorecord)
- TapeStartRecording();
-
-#if defined(PLATFORM_UNIX)
- if (options.network)
- SendToServer_StartPlaying();
- else
-#endif
- {
- game_status = GAME_MODE_PLAYING;
- StopAnimation();
- InitGame();
- }
+ StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
return;
}
TapeQuickLoad();
else if (key == setup.shortcut.toggle_pause)
TapeTogglePause(TAPE_TOGGLE_MANUAL);
+ }
- HandleKeysCheating(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);
+
if (HandleGadgetsKeyInput(key))
{
if (key != KSYM_Escape) /* always allow ESC key to be handled */
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)
{
+#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)
+ 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);
break;
case KSYM_Escape:
- if (game_status == GAME_MODE_LEVELS)
+ 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);
HandleInfoScreen(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;
}
case GAME_MODE_SCORES:
switch(key)
{
+ case KSYM_space:
case KSYM_Return:
case KSYM_Escape:
game_status = GAME_MODE_MAIN;
#ifdef DEBUG
case KSYM_0:
+#if 0
case KSYM_1:
case KSYM_2:
case KSYM_3:
case KSYM_7:
case KSYM_8:
case KSYM_9:
+#endif
if (key == KSYM_0)
{
if (GameFrameDelay == 500)
}
break;
-#if 0
- case KSYM_a:
- if (ScrollStepSize == TILEX/8)
- ScrollStepSize = TILEX/4;
- else
- ScrollStepSize = TILEX/8;
- printf("ScrollStepSize == %d\n", ScrollStepSize);
- break;
-#endif
-
-#if 0
- case KSYM_m:
- if (MoveSpeed == 8)
- {
- MoveSpeed = 4;
- ScrollStepSize = TILEX/4;
- }
- else
- {
- MoveSpeed = 8;
- ScrollStepSize = TILEX/8;
- }
- printf("MoveSpeed == %d\n", MoveSpeed);
- break;
-#endif
-
case KSYM_f:
ScrollStepSize = TILEX/8;
printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize);
printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize);
break;
-#if 0
-
- case KSYM_z:
- {
- int i;
-
- for (i = 0; i < MAX_PLAYERS; i++)
- {
- printf("Player %d:\n", i);
- printf(" jx == %d, jy == %d\n",
- stored_player[i].jx, stored_player[i].jy);
- printf(" last_jx == %d, last_jy == %d\n",
- stored_player[i].last_jx, stored_player[i].last_jy);
- }
- printf("\n");
- }
-
+ case KSYM_v:
+ printf("::: currently using game engine version %d\n",
+ game.engine_version);
break;
-#endif
#endif
default:
return;
}
-#if defined(PLATFORM_UNIX)
+#if defined(NETWORK_AVALIABLE)
if (options.network)
HandleNetworking();
#endif
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)
+ 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);