#include "editor.h"
#include "files.h"
#include "tape.h"
-#include "cartoons.h"
+#include "anim.h"
#include "network.h"
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;
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;
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_equal || // ("Shift-=" is "+" on US keyboards)
key == KSYM_0) &&
((GetKeyModState() & KMOD_Control) ||
- (GetKeyModState() & KMOD_Alt)) &&
+ (GetKeyModState() & KMOD_Alt) ||
+ (GetKeyModState() & KMOD_Meta)) &&
video.window_scaling_available &&
!video.fullscreen_enabled)
{
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;
}
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)
{
return;
}
}
+
+#ifdef DEBUG
+ if (game_status == GAME_MODE_PLAYING || !setup.debug.frame_delay_game_only)
+ {
+ boolean mod_key_pressed = ((GetKeyModState() & KMOD_Control) ||
+ (GetKeyModState() & KMOD_Alt) ||
+ (GetKeyModState() & KMOD_Meta));
+
+ 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;
+ }
+ }
+ }
+#endif
}
void HandleNoEvent()
{
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: