#include "editor.h"
#include "files.h"
#include "tape.h"
-#include "cartoons.h"
+#include "anim.h"
#include "network.h"
#define DEBUG_EVENTS_BUTTON (DEBUG_EVENTS * 0)
#define DEBUG_EVENTS_MOTION (DEBUG_EVENTS * 0)
+#define DEBUG_EVENTS_WHEEL (DEBUG_EVENTS * 1)
#define DEBUG_EVENTS_WINDOW (DEBUG_EVENTS * 0)
#define DEBUG_EVENTS_FINGER (DEBUG_EVENTS * 0)
#define DEBUG_EVENTS_TEXT (DEBUG_EVENTS * 1)
break;
#if defined(TARGET_SDL2)
+ case EVENT_WHEELMOTION:
+ HandleWheelEvent((WheelEvent *) &event);
+ break;
+
case SDL_WINDOWEVENT:
HandleWindowEvent((WindowEvent *) &event);
break;
void EventLoop(void)
{
- unsigned int sync_frame_delay = 0;
- unsigned int sync_frame_delay_value = GAME_FRAME_DELAY;
-
while (1)
{
if (PendingEvent())
if (game_status == GAME_MODE_PLAYING)
HandleGameActions();
- /* refresh window contents from drawing buffer, if needed */
+ /* always copy backbuffer to visible screen for every video frame */
BackToFront();
- if (game_status != GAME_MODE_PLAYING)
- WaitUntilDelayReached(&sync_frame_delay, sync_frame_delay_value);
+ /* reset video frame delay to default (may change again while playing) */
+ SetVideoFrameDelay(MenuFrameDelay);
if (game_status == GAME_MODE_QUIT)
return;
#if defined(TARGET_SDL2)
+void HandleWheelEvent(WheelEvent *event)
+{
+ int button_nr;
+
+#if DEBUG_EVENTS_WHEEL
+#if 1
+ Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d\n",
+ event->which, event->x, event->y);
+#else
+ // (SDL_MOUSEWHEEL_NORMAL/SDL_MOUSEWHEEL_FLIPPED needs SDL 2.0.4 or newer)
+ Error(ERR_DEBUG, "WHEEL EVENT: mouse == %d, x/y == %d/%d, direction == %s\n",
+ event->which, event->x, event->y,
+ (event->direction == SDL_MOUSEWHEEL_NORMAL ? "SDL_MOUSEWHEEL_NORMAL" :
+ "SDL_MOUSEWHEEL_FLIPPED"));
+#endif
+#endif
+
+ button_nr = (event->x < 0 ? MB_WHEEL_LEFT :
+ event->x > 0 ? MB_WHEEL_RIGHT :
+ event->y < 0 ? MB_WHEEL_DOWN :
+ event->y > 0 ? MB_WHEEL_UP : 0);
+
+#if defined(PLATFORM_WIN32) || defined(PLATFORM_MACOSX)
+ // accelerated mouse wheel available on Mac and Windows
+ wheel_steps = (event->x ? ABS(event->x) : ABS(event->y));
+#else
+ // no accelerated mouse wheel available on Unix/Linux
+ wheel_steps = DEFAULT_WHEEL_STEPS;
+#endif
+
+ motion_status = FALSE;
+
+ button_status = button_nr;
+ HandleButton(0, 0, button_status, -button_nr);
+
+ button_status = MB_RELEASED;
+ HandleButton(0, 0, button_status, -button_nr);
+}
+
void HandleWindowEvent(WindowEvent *event)
{
#if DEBUG_EVENTS_WINDOW
event_name, event->data1, event->data2);
#endif
+#if 0
+ // (not needed, as the screen gets redrawn every 20 ms anyway)
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||
event->event == SDL_WINDOWEVENT_RESIZED ||
event->event == SDL_WINDOWEVENT_EXPOSED)
SDLRedrawWindow();
+#endif
if (event->event == SDL_WINDOWEVENT_RESIZED && !video.fullscreen_enabled)
{
int new_xpercent = (100 * new_window_width / video.width);
int new_ypercent = (100 * new_window_height / video.height);
- setup.window_scaling_percent = video.window_scaling_percent =
- MIN(MAX(MIN_WINDOW_SCALING_PERCENT, MIN(new_xpercent, new_ypercent)),
+ // (extreme window scaling allowed, but cannot be saved permanently)
+ video.window_scaling_percent = MIN(new_xpercent, new_ypercent);
+ setup.window_scaling_percent =
+ MIN(MAX(MIN_WINDOW_SCALING_PERCENT, video.window_scaling_percent),
MAX_WINDOW_SCALING_PERCENT);
video.window_width = new_window_width;
static int old_mx = 0, old_my = 0;
boolean button_hold = FALSE;
- if (button < 0)
+ if (button_nr < 0)
{
mx = old_mx;
my = old_my;
- button = -button;
+ button_nr = -button_nr;
button_hold = TRUE;
}
else
}
}
+void HandleKeysDebug(Key key)
+{
+#ifdef DEBUG
+ int i;
+
+ if (game_status == GAME_MODE_PLAYING || !setup.debug.frame_delay_game_only)
+ {
+ boolean mod_key_pressed = (GetKeyModState() != KMOD_None);
+
+ for (i = 0; i < NUM_DEBUG_FRAME_DELAY_KEYS; i++)
+ {
+ if (key == setup.debug.frame_delay_key[i] &&
+ (mod_key_pressed == setup.debug.frame_delay_use_mod_key))
+ {
+ GameFrameDelay = (GameFrameDelay != setup.debug.frame_delay[i] ?
+ setup.debug.frame_delay[i] : GAME_FRAME_DELAY);
+
+ if (!setup.debug.frame_delay_game_only)
+ MenuFrameDelay = GameFrameDelay;
+
+ SetVideoFrameDelay(GameFrameDelay);
+
+ if (GameFrameDelay > ONE_SECOND_DELAY)
+ Error(ERR_DEBUG, "frame delay == %d ms", GameFrameDelay);
+ else if (GameFrameDelay != 0)
+ Error(ERR_DEBUG, "frame delay == %d ms (max. %d fps / %d %%)",
+ GameFrameDelay, ONE_SECOND_DELAY / GameFrameDelay,
+ GAME_FRAME_DELAY * 100 / GameFrameDelay);
+ else
+ Error(ERR_DEBUG, "frame delay == 0 ms (maximum speed)");
+
+ break;
+ }
+ }
+ }
+
+ if (game_status == GAME_MODE_PLAYING)
+ {
+ if (key == KSYM_d)
+ {
+ options.debug = !options.debug;
+
+ Error(ERR_DEBUG, "debug mode %s",
+ (options.debug ? "enabled" : "disabled"));
+ }
+ else if (key == KSYM_v)
+ {
+ Error(ERR_DEBUG, "currently using game engine version %d",
+ game.engine_version);
+ }
+ }
+#endif
+}
+
void HandleKey(Key key, int key_status)
{
boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive();
+ static boolean ignore_repeated_key = FALSE;
static struct SetupKeyboardInfo ski;
static struct SetupShortcutInfo ssi;
static struct
key_joystick_mapping = 0;
if (key_status == KEY_RELEASED)
+ {
+ // reset flag to ignore repeated "key pressed" events after key release
+ ignore_repeated_key = FALSE;
+
return;
+ }
if ((key == KSYM_F11 ||
((key == KSYM_Return ||
key == KSYM_KP_Enter) && (GetKeyModState() & KMOD_Alt))) &&
- video.fullscreen_available)
+ video.fullscreen_available &&
+ !ignore_repeated_key)
{
setup.fullscreen = !setup.fullscreen;
if (game_status == GAME_MODE_SETUP)
RedrawSetupScreenAfterFullscreenToggle();
+ // set flag to ignore repeated "key pressed" events
+ ignore_repeated_key = TRUE;
+
return;
}
- if ((key == KSYM_minus ||
- key == KSYM_plus ||
- key == KSYM_0) &&
- ((GetKeyModState() & KMOD_Control) ||
- (GetKeyModState() & KMOD_Alt)) &&
+ if ((key == KSYM_0 || key == KSYM_KP_0 ||
+ key == KSYM_minus || key == KSYM_KP_Subtract ||
+ key == KSYM_plus || key == KSYM_KP_Add ||
+ key == KSYM_equal) && // ("Shift-=" is "+" on US keyboards)
+ (GetKeyModState() & (KMOD_Control | KMOD_Meta)) &&
video.window_scaling_available &&
!video.fullscreen_enabled)
{
- if (key == KSYM_0)
+ if (key == KSYM_0 || key == KSYM_KP_0)
setup.window_scaling_percent = STD_WINDOW_SCALING_PERCENT;
+ else if (key == KSYM_minus || key == KSYM_KP_Subtract)
+ setup.window_scaling_percent -= STEP_WINDOW_SCALING_PERCENT;
else
- setup.window_scaling_percent +=
- (key == KSYM_minus ? -1 : +1) * STEP_WINDOW_SCALING_PERCENT;
+ setup.window_scaling_percent += STEP_WINDOW_SCALING_PERCENT;
if (setup.window_scaling_percent < MIN_WINDOW_SCALING_PERCENT)
setup.window_scaling_percent = MIN_WINDOW_SCALING_PERCENT;
else if (key == setup.shortcut.load_game)
TapeQuickLoad();
else if (key == setup.shortcut.toggle_pause)
- TapeTogglePause(TAPE_TOGGLE_MANUAL);
+ TapeTogglePause(TAPE_TOGGLE_MANUAL | TAPE_TOGGLE_PLAY_PAUSE);
HandleTapeButtonKeys(key);
HandleSoundButtonKeys(key);
HandleHallOfFame(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
break;
-#ifdef DEBUG
- case KSYM_0:
- GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500);
- break;
-
- 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;
}
RequestQuitGame(setup.ask_on_escape);
break;
-#ifdef DEBUG
- case KSYM_0:
- if (key == KSYM_0)
- {
- if (GameFrameDelay == 500)
- GameFrameDelay = GAME_FRAME_DELAY;
- else
- GameFrameDelay = 500;
- }
- else
- GameFrameDelay = (key - KSYM_0) * 10;
- printf("Game speed == %d%% (%d ms delay between two frames)\n",
- GAME_FRAME_DELAY * 100 / GameFrameDelay, GameFrameDelay);
- break;
-
- case KSYM_d:
- if (options.debug)
- {
- options.debug = FALSE;
- printf("debug mode disabled\n");
- }
- else
- {
- options.debug = TRUE;
- printf("debug mode enabled\n");
- }
- break;
-
- case KSYM_v:
- printf("::: currently using game engine version %d\n",
- game.engine_version);
- break;
-#endif
-
default:
break;
}
return;
}
}
+
+ HandleKeysDebug(key);
}
void HandleNoEvent()
// if (button_status && game_status != GAME_MODE_PLAYING)
if (button_status && (game_status != GAME_MODE_PLAYING || tape.pausing))
{
- HandleButton(0, 0, -button_status, button_status);
+ HandleButton(0, 0, button_status, -button_status);
}
else
{
{
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: