}
}
}
-
- // !!! CHECK THIS:
- // !!! this may result in "HandleNoEvent()" never being called
- // !!! (especially due to continuously processed tocuh events)
- // !!! and therefore toon animations being stopped while events
- // !!! are being processed (even if they are all thrown away)
-
else
{
/* when playing, display a special mouse pointer inside the playfield */
playfield_cursor_set = FALSE;
}
+#if 0
HandleNoEvent();
+#endif
}
+#if 1
+ HandleNoEvent();
+#endif
+
/* don't use all CPU time when idle; the main loop while playing
has its own synchronization and is CPU friendly, too */
int new_window_width = event->data1;
int new_window_height = event->data2;
- printf("::: RESIZED from %d, %d to %d, %d\n",
- video.window_width, video.window_height,
- new_window_width, new_window_height);
-
// if window size has changed after resizing, calculate new scaling factor
if (new_window_width != video.window_width ||
new_window_height != video.window_height)
int new_xpercent = (100 * new_window_width / video.width);
int new_ypercent = (100 * new_window_height / video.height);
+ printf("::: RESIZED from %d, %d to %d, %d\n",
+ video.window_width, video.window_height,
+ new_window_width, new_window_height);
+
setup.window_scaling_percent = video.window_scaling_percent =
MIN(MAX(MIN_WINDOW_SCALING_PERCENT, MIN(new_xpercent, new_ypercent)),
MAX_WINDOW_SCALING_PERCENT);
}
}
+#if 1
+
+#define NUM_TOUCH_FINGERS 3
+
+static struct
+{
+ boolean touched;
+ SDL_FingerID finger_id;
+ int counter;
+ Key key;
+} touch_info[NUM_TOUCH_FINGERS];
+
+void HandleFingerEvent(FingerEvent *event)
+{
+ static Key motion_key_x = KSYM_UNDEFINED;
+ static Key motion_key_y = KSYM_UNDEFINED;
+ static Key button_key = KSYM_UNDEFINED;
+ static float motion_x1, motion_y1;
+ static float button_x1, button_y1;
+ static SDL_FingerID motion_id = 0;
+ static SDL_FingerID button_id = 0;
+ int trigger_distance_percent = 1; // percent of touchpad width/height
+ float trigger_distance = (float)trigger_distance_percent / 100;
+ float event_x = event->x;
+ float event_y = event->y;
+
+#if 1
+#if DEBUG_EVENTS
+ Error(ERR_DEBUG, "FINGER EVENT: finger was %s, touch ID %lld, finger ID %lld, x/y %f/%f, dx/dy %f/%f, pressure %f",
+ event->type == EVENT_FINGERPRESS ? "pressed" :
+ event->type == EVENT_FINGERRELEASE ? "released" : "moved",
+ event->touchId,
+ event->fingerId,
+ event->x, event->y,
+ event->dx, event->dy,
+ event->pressure);
+#endif
+#endif
+
+ if (game_status != GAME_MODE_PLAYING)
+ return;
+
+ if (1)
+ {
+ int key_status = (event->type == EVENT_FINGERRELEASE ? KEY_RELEASED :
+ KEY_PRESSED);
+#if 1
+ Key key = (event->x < 1.0 / 3.0 ?
+ (event->y < 1.0 / 2.0 ? setup.input[0].key.snap :
+ setup.input[0].key.drop) :
+ event->x > 2.0 / 3.0 ?
+ (event->y < 1.0 / 3.0 ? setup.input[0].key.up :
+ event->y > 2.0 / 3.0 ? setup.input[0].key.down :
+ event->x < 5.0 / 6.0 ? setup.input[0].key.left :
+ setup.input[0].key.right) :
+ KSYM_UNDEFINED);
+#if 0
+ char *key_name = (key == setup.input[0].key.snap ? "SNAP" :
+ key == setup.input[0].key.drop ? "DROP" :
+ key == setup.input[0].key.up ? "UP" :
+ key == setup.input[0].key.down ? "DOWN" :
+ key == setup.input[0].key.left ? "LEFT" :
+ key == setup.input[0].key.right ? "RIGHT" : "(unknown)");
+#endif
+ char *key_status_name = (key_status == KEY_RELEASED ? "KEY_RELEASED" :
+ "KEY_PRESSED");
+#else
+ Key key = (event->y < 1.0 / 3.0 ? setup.input[0].key.up :
+ event->y > 2.0 / 3.0 ? setup.input[0].key.down :
+ event->x < 1.0 / 3.0 ? setup.input[0].key.left :
+ event->x > 2.0 / 3.0 ? setup.input[0].key.right :
+ setup.input[0].key.snap);
+#endif
+ int i;
+
+ Error(ERR_DEBUG, "::: key '%s' was '%s' [fingerId: %lld]",
+ getKeyNameFromKey(key), key_status_name, event->fingerId);
+
+ // check if we already know this touch event's finger id
+ for (i = 0; i < NUM_TOUCH_FINGERS; i++)
+ {
+ if (touch_info[i].touched &&
+ touch_info[i].finger_id == event->fingerId)
+ {
+ // Error(ERR_DEBUG, "MARK 1: %d", i);
+
+ break;
+ }
+ }
+
+ if (i >= NUM_TOUCH_FINGERS)
+ {
+ if (key_status == KEY_PRESSED)
+ {
+ int oldest_pos = 0, oldest_counter = touch_info[0].counter;
+
+ // unknown finger id -- get new, empty slot, if available
+ for (i = 0; i < NUM_TOUCH_FINGERS; i++)
+ {
+ if (touch_info[i].counter < oldest_counter)
+ {
+ oldest_pos = i;
+ oldest_counter = touch_info[i].counter;
+
+ // Error(ERR_DEBUG, "MARK 2: %d", i);
+ }
+
+ if (!touch_info[i].touched)
+ {
+ // Error(ERR_DEBUG, "MARK 3: %d", i);
+
+ break;
+ }
+ }
+
+ if (i >= NUM_TOUCH_FINGERS)
+ {
+ // all slots allocated -- use oldest slot
+ i = oldest_pos;
+
+ // Error(ERR_DEBUG, "MARK 4: %d", i);
+ }
+ }
+ else
+ {
+ // release of previously unknown key (should not happen)
+
+ if (key != KSYM_UNDEFINED)
+ {
+ HandleKey(key, KEY_RELEASED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [1]",
+ getKeyNameFromKey(key), "KEY_RELEASED", i);
+ }
+ }
+ }
+
+ if (i < NUM_TOUCH_FINGERS)
+ {
+ if (key_status == KEY_PRESSED)
+ {
+ if (touch_info[i].key != key)
+ {
+ if (touch_info[i].key != KSYM_UNDEFINED)
+ {
+ HandleKey(touch_info[i].key, KEY_RELEASED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [2]",
+ getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i);
+ }
+
+ if (key != KSYM_UNDEFINED)
+ {
+ HandleKey(key, KEY_PRESSED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [3]",
+ getKeyNameFromKey(key), "KEY_PRESSED", i);
+ }
+ }
+
+ touch_info[i].touched = TRUE;
+ touch_info[i].finger_id = event->fingerId;
+ touch_info[i].counter = Counter();
+ touch_info[i].key = key;
+ }
+ else
+ {
+ if (touch_info[i].key != KSYM_UNDEFINED)
+ {
+ HandleKey(touch_info[i].key, KEY_RELEASED);
+
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d] [4]",
+ getKeyNameFromKey(touch_info[i].key), "KEY_RELEASED", i);
+ }
+
+ touch_info[i].touched = FALSE;
+ touch_info[i].finger_id = 0;
+ touch_info[i].counter = 0;
+ touch_info[i].key = 0;
+ }
+ }
+
+#if 0
+#if 1
+ Error(ERR_DEBUG, "=> key == '%s', key_status == '%s' [slot %d]",
+ key_name, key_status_name, i);
+#else
+ Error(ERR_DEBUG, "=> key == %d, key_status == %d [%d]", key, key_status, i);
+#endif
+#endif
+
+ return;
+ }
+
+ if (event->type == EVENT_FINGERPRESS)
+ {
+ if (event_x > 1.0 / 3.0)
+ {
+ // motion area
+
+ motion_id = event->fingerId;
+
+ motion_x1 = event_x;
+ motion_y1 = event_y;
+
+ motion_key_x = KSYM_UNDEFINED;
+ motion_key_y = KSYM_UNDEFINED;
+
+ Error(ERR_DEBUG, "---------- MOVE STARTED (WAIT) ----------");
+ }
+ else
+ {
+ // button area
+
+ button_id = event->fingerId;
+
+ button_x1 = event_x;
+ button_y1 = event_y;
+
+ button_key = setup.input[0].key.snap;
+
+ HandleKey(button_key, KEY_PRESSED);
+
+ Error(ERR_DEBUG, "---------- SNAP STARTED ----------");
+ }
+ }
+ else if (event->type == EVENT_FINGERRELEASE)
+ {
+ if (event->fingerId == motion_id)
+ {
+ motion_id = 0;
+
+ if (motion_key_x != KSYM_UNDEFINED)
+ HandleKey(motion_key_x, KEY_RELEASED);
+ if (motion_key_y != KSYM_UNDEFINED)
+ HandleKey(motion_key_y, KEY_RELEASED);
+
+ motion_key_x = KSYM_UNDEFINED;
+ motion_key_y = KSYM_UNDEFINED;
+
+ Error(ERR_DEBUG, "---------- MOVE STOPPED ----------");
+ }
+ else if (event->fingerId == button_id)
+ {
+ button_id = 0;
+
+ if (button_key != KSYM_UNDEFINED)
+ HandleKey(button_key, KEY_RELEASED);
+
+ button_key = KSYM_UNDEFINED;
+
+ Error(ERR_DEBUG, "---------- SNAP STOPPED ----------");
+ }
+ }
+ else if (event->type == EVENT_FINGERMOTION)
+ {
+ if (event->fingerId == motion_id)
+ {
+ float distance_x = ABS(event_x - motion_x1);
+ float distance_y = ABS(event_y - motion_y1);
+ Key new_motion_key_x = (event_x < motion_x1 ? setup.input[0].key.left :
+ event_x > motion_x1 ? setup.input[0].key.right :
+ KSYM_UNDEFINED);
+ Key new_motion_key_y = (event_y < motion_y1 ? setup.input[0].key.up :
+ event_y > motion_y1 ? setup.input[0].key.down :
+ KSYM_UNDEFINED);
+
+ if (distance_x < trigger_distance / 2 ||
+ distance_x < distance_y)
+ new_motion_key_x = KSYM_UNDEFINED;
+
+ if (distance_y < trigger_distance / 2 ||
+ distance_y < distance_x)
+ new_motion_key_y = KSYM_UNDEFINED;
+
+ if (distance_x > trigger_distance ||
+ distance_y > trigger_distance)
+ {
+ if (new_motion_key_x != motion_key_x)
+ {
+ if (motion_key_x != KSYM_UNDEFINED)
+ HandleKey(motion_key_x, KEY_RELEASED);
+ if (new_motion_key_x != KSYM_UNDEFINED)
+ HandleKey(new_motion_key_x, KEY_PRESSED);
+ }
+
+ if (new_motion_key_y != motion_key_y)
+ {
+ if (motion_key_y != KSYM_UNDEFINED)
+ HandleKey(motion_key_y, KEY_RELEASED);
+ if (new_motion_key_y != KSYM_UNDEFINED)
+ HandleKey(new_motion_key_y, KEY_PRESSED);
+ }
+
+ motion_x1 = event_x;
+ motion_y1 = event_y;
+
+ motion_key_x = new_motion_key_x;
+ motion_key_y = new_motion_key_y;
+
+ Error(ERR_DEBUG, "---------- MOVE STARTED (MOVE) ----------");
+ }
+ }
+ else if (event->fingerId == button_id)
+ {
+ float distance_x = ABS(event_x - button_x1);
+ float distance_y = ABS(event_y - button_y1);
+
+ if (distance_x < trigger_distance / 2 &&
+ distance_y > trigger_distance)
+ {
+ if (button_key == setup.input[0].key.snap)
+ HandleKey(button_key, KEY_RELEASED);
+
+ button_x1 = event_x;
+ button_y1 = event_y;
+
+ button_key = setup.input[0].key.drop;
+
+ HandleKey(button_key, KEY_PRESSED);
+
+ Error(ERR_DEBUG, "---------- DROP STARTED ----------");
+ }
+ }
+ }
+}
+
+#else
+
void HandleFingerEvent(FingerEvent *event)
{
#if 0
#endif
}
+#endif
+
static boolean checkTextInputKeyModState()
{
// when playing, only handle raw key events and ignore text input
old_my = my;
}
+#if defined(PLATFORM_ANDROID)
+ if (game_status != GAME_MODE_PLAYING &&
+ HandleGadgets(mx, my, button))
+ {
+ /* do not handle this button event anymore */
+ mx = my = -32; /* force mouse event to be outside screen tiles */
+ }
+#else
if (HandleGadgets(mx, my, button))
{
/* do not handle this button event anymore */
mx = my = -32; /* force mouse event to be outside screen tiles */
}
+#endif
/* do not use scroll wheel button events for anything other than gadgets */
if (IS_WHEEL_BUTTON(button_nr))
case GAME_MODE_PLAYING:
#ifdef DEBUG
- if (button == MB_PRESSED && !motion_status && IN_GFX_SCREEN(mx, my))
+ if (button == MB_PRESSED && !motion_status && IN_GFX_FIELD_PLAY(mx, my))
DumpTile(LEVELX((mx - SX) / TILEX), LEVELY((my - SY) / TILEY));
#endif
break;
{
DumpTape(&tape);
}
+ else if (is_string_suffix(cheat_input, ":fix-tape") ||
+ is_string_suffix(cheat_input, ":ft"))
+ {
+ /* fix single-player tapes that contain player input for more than one
+ player (due to a bug in 3.3.1.2 and earlier versions), which results
+ in playing levels with more than one player in multi-player mode,
+ even though the tape was originally recorded in single-player mode */
+
+ /* remove player input actions for all players but the first one */
+ for (i = 1; i < MAX_PLAYERS; i++)
+ tape.player_participates[i] = FALSE;
+
+ tape.changed = TRUE;
+ }
else if (is_string_suffix(cheat_input, ":save-native-level") ||
is_string_suffix(cheat_input, ":snl"))
{
printf("::: %d\n", setup.window_scaling_percent);
#endif
- ToggleFullscreenIfNeeded();
+ ToggleFullscreenOrChangeWindowScalingIfNeeded();
if (game_status == GAME_MODE_SETUP)
RedrawSetupScreenAfterFullscreenToggle();
}
if ((key == KSYM_minus || key == KSYM_plus || key == KSYM_0) &&
- (GetKeyModState() & KMOD_Control) && video.window_scaling_available &&
+ (GetKeyModState() & KMOD_Alt) && video.window_scaling_available &&
!video.fullscreen_enabled)
{
if (key == KSYM_0)
else if (setup.window_scaling_percent > MAX_WINDOW_SCALING_PERCENT)
setup.window_scaling_percent = MAX_WINDOW_SCALING_PERCENT;
- ToggleFullscreenIfNeeded();
+ ToggleFullscreenOrChangeWindowScalingIfNeeded();
if (game_status == GAME_MODE_SETUP)
RedrawSetupScreenAfterFullscreenToggle();
}
break;
+#if 0
case KSYM_s:
if (!global.fps_slowdown)
{
printf("fps slowdown disabled\n");
}
break;
+#endif
+#if 0
case KSYM_f:
ScrollStepSize = TILEX / 8;
printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize);
ScrollStepSize = TILEX;
printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize);
break;
+#endif
case KSYM_v:
printf("::: currently using game engine version %d\n",
{
HandleButton(0, 0, -button_status, button_status);
+#if 0
return;
+#endif
+ }
+ else
+ {
+ HandleJoystick();
}
#if defined(NETWORK_AVALIABLE)
HandleNetworking();
#endif
- HandleJoystick();
+ switch (game_status)
+ {
+ case GAME_MODE_MAIN:
+ DrawPreviewLevelAnimation();
+ DoAnimation();
+ break;
+
+ case GAME_MODE_LEVELS:
+ case GAME_MODE_LEVELNR:
+ case GAME_MODE_SETUP:
+ case GAME_MODE_INFO:
+ case GAME_MODE_SCORES:
+ DoAnimation();
+ break;
+
+ case GAME_MODE_EDITOR:
+ HandleLevelEditorIdle();
+ break;
+
+ default:
+ break;
+ }
}
static int HandleJoystickForAllPlayers()
HandleHallOfFame(0, 0, dx, dy, !newbutton);
break;
+#if 0
case GAME_MODE_EDITOR:
HandleLevelEditorIdle();
break;
+#endif
case GAME_MODE_PLAYING:
if (tape.playing || keyboard)
newbutton = ((joy & JOY_BUTTON) != 0);
#if 0
- if (local_player->LevelSolved_GameEnd && newbutton)
+ if (newbutton && local_player->LevelSolved_GameEnd)
#else
- if (AllPlayersGone && newbutton)
+ if (newbutton && AllPlayersGone)
#endif
{
GameEnd();