X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=4c71dca04ece48c1d1e0b436656b51234f4c5c90;hb=5d3436c34268fb35d378a39d9d825def453afbec;hp=041c49b4e13b54d0314a111cf00773e817b95800;hpb=d2457f732e2efb77ba786691efbd3cee6a9a69b9;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 041c49b4..4c71dca0 100644 --- a/src/events.c +++ b/src/events.c @@ -19,6 +19,7 @@ #include "editor.h" #include "files.h" #include "tape.h" +#include "cartoons.h" #include "network.h" @@ -66,7 +67,7 @@ static int FilterEventsExt(const Event *event) /* do no reset mouse cursor before all pending events have been processed */ if (gfx.cursor_mode == cursor_mode_last && - ((effectiveGameStatus() == GAME_MODE_TITLE && + ((game_status == GAME_MODE_TITLE && gfx.cursor_mode == CURSOR_NONE) || (game_status == GAME_MODE_PLAYING && gfx.cursor_mode == CURSOR_PLAYFIELD))) @@ -153,12 +154,20 @@ boolean NextValidEvent(Event *event) void EventLoop(void) { + static unsigned int sync_frame_delay = 0; + unsigned int sync_frame_delay_value = GAME_FRAME_DELAY; + while (1) { if (PendingEvent()) /* got event */ { + // use separate frame delay counter to not reset main delay counter + unsigned int sync_frame_delay2 = 0; + unsigned int sync_frame_delay_value2 = sync_frame_delay_value; Event event; + ResetDelayCounter(&sync_frame_delay2); + while (NextValidEvent(&event)) { switch (event.type) @@ -204,11 +213,16 @@ void EventLoop(void) HandleOtherEvents(&event); break; } + + // do not handle events for longer than standard frame delay period + if (DelayReached(&sync_frame_delay2, sync_frame_delay_value2)) + break; } } - else + + // always handle non-event game actions for every game frame interval { - if (effectiveGameStatus() == GAME_MODE_TITLE) + if (game_status == GAME_MODE_TITLE) { /* when showing title screens, hide mouse pointer (if not moved) */ @@ -218,7 +232,8 @@ void EventLoop(void) SetMouseCursor(CURSOR_NONE); } } - else if (game_status == GAME_MODE_PLAYING && !tape.pausing) + else if (game_status == GAME_MODE_PLAYING && (!tape.pausing || + tape.single_step)) { /* when playing, display a special mouse pointer inside the playfield */ @@ -245,18 +260,14 @@ void EventLoop(void) has its own synchronization and is CPU friendly, too */ if (game_status == GAME_MODE_PLAYING) - { HandleGameActions(); - } - else - { - if (!PendingEvent()) /* delay only if no pending events */ - Delay(10); - } /* refresh window contents from drawing buffer, if needed */ BackToFront(); + if (game_status != GAME_MODE_PLAYING) + WaitUntilDelayReached(&sync_frame_delay, sync_frame_delay_value); + if (game_status == GAME_MODE_QUIT) return; } @@ -1566,7 +1577,8 @@ void HandleKey(Key key, int key_status) default: if (key == KSYM_Escape) { - game_status = GAME_MODE_MAIN; + SetGameStatus(GAME_MODE_MAIN); + DrawMainMenu(); return;