X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=f3ce7a3a555f9b46ac930209b77fc9aeae621413;hb=d593293724c160fbccd186edd30dd7287d7f0311;hp=3af2b5f9220a853757939b8c7664fea97427eeb8;hpb=db6f077754043bf94cf6a18ced0c0191744a1487;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 3af2b5f9..f3ce7a3a 100644 --- a/src/tools.c +++ b/src/tools.c @@ -233,7 +233,7 @@ void DumpTile(int x, int y) void SetDrawtoField(int mode) { - if (mode == DRAW_BUFFERED && setup.soft_scrolling) + if (mode == DRAW_FIELDBUFFER && setup.soft_scrolling) { FX = 2 * TILEX_VAR; FY = 2 * TILEY_VAR; @@ -954,7 +954,7 @@ void ClearField() if (setup.soft_scrolling && game_status == GAME_MODE_PLAYING) { ClearRectangle(fieldbuffer, 0, 0, FXSIZE, FYSIZE); - SetDrawtoField(DRAW_BUFFERED); + SetDrawtoField(DRAW_FIELDBUFFER); } else SetDrawtoField(DRAW_BACKBUFFER); @@ -2127,7 +2127,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) boolean no_delay = (tape.warp_forward); unsigned int anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); - int anim_delay_value = (no_delay ? 0 : frame_delay_value); + int anim_delay_value = (no_delay ? 0 : frame_delay_value) / 2; int font_nr = FONT_ENVELOPE_1 + envelope_nr; int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); @@ -2139,17 +2139,22 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) int yend = (anim_mode != ANIM_DEFAULT ? max_ysize : 0); int xstep = (xstart < xend ? 1 : 0); int ystep = (ystart < yend || xstep == 0 ? 1 : 0); - int x, y; + int start = 0; + int end = MAX(xend - xstart, yend - ystart); + int i; - for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep) + for (i = start; i <= end; i++) { + int last_frame = end; // last frame of this "for" loop + int x = xstart + i * xstep; + int y = ystart + i * ystep; int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2; int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2; int sx = SX + (SXSIZE - xsize * font_width) / 2; int sy = SY + (SYSIZE - ysize * font_height) / 2; int xx, yy; - SetDrawtoField(DRAW_BUFFERED); + SetDrawtoField(DRAW_FIELDBUFFER); BlitScreenToBitmap(backbuffer); @@ -2168,7 +2173,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) redraw_mask |= REDRAW_FIELD | REDRAW_FROM_BACKBUFFER; BackToFront(); - WaitUntilDelayReached(&anim_delay, anim_delay_value / 2); + SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame); } } @@ -2210,7 +2215,7 @@ void ShowEnvelope(int envelope_nr) game.envelope_active = FALSE; - SetDrawtoField(DRAW_BUFFERED); + SetDrawtoField(DRAW_FIELDBUFFER); redraw_mask |= REDRAW_FIELD; BackToFront(); @@ -2319,7 +2324,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action) boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); int delay_value = (ffwd_delay ? delay_value_fast : delay_value_normal); - int anim_delay_value = (no_delay ? 0 : delay_value + 500 * 0); + int anim_delay_value = (no_delay ? 0 : delay_value + 500 * 0) / 2; unsigned int anim_delay = 0; int width = request.width; @@ -2336,12 +2341,15 @@ void AnimateEnvelopeRequest(int anim_mode, int action) int yend = (anim_mode != ANIM_DEFAULT ? max_ysize_inner : 0); int xstep = (xstart < xend ? 1 : 0); int ystep = (ystart < yend || xstep == 0 ? 1 : 0); - int x, y; + int start = 0; + int end = MAX(xend - xstart, yend - ystart); + int i; if (setup.quick_doors) { xstart = xend; ystart = yend; + end = 0; } else { @@ -2351,8 +2359,11 @@ void AnimateEnvelopeRequest(int anim_mode, int action) PlayMenuSoundStereo(SND_DOOR_CLOSING, SOUND_MIDDLE); } - for (x = xstart, y = ystart; x <= xend && y <= yend; x += xstep, y += ystep) + for (i = start; i <= end; i++) { + int last_frame = end; // last frame of this "for" loop + int x = xstart + i * xstep; + int y = ystart + i * ystep; int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2; int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2; int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2); @@ -2394,7 +2405,7 @@ void AnimateEnvelopeRequest(int anim_mode, int action) DoAnimation(); BackToFront(); - WaitUntilDelayReached(&anim_delay, anim_delay_value / 2); + SkipUntilDelayReached(&anim_delay, anim_delay_value, &i, last_frame); } } @@ -2456,7 +2467,6 @@ void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) AnimateEnvelopeRequest(ANIM_DEFAULT, ACTION_OPENING); AnimateEnvelopeRequest(main_anim_mode, ACTION_OPENING); - } else { @@ -2493,7 +2503,7 @@ void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) if (action == ACTION_CLOSING && game_status == GAME_MODE_PLAYING && level.game_engine_type == GAME_ENGINE_TYPE_RND) - SetDrawtoField(DRAW_BUFFERED); + SetDrawtoField(DRAW_FIELDBUFFER); } void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize) @@ -3389,109 +3399,110 @@ static int RequestHandleEvents(unsigned int req_state) { Event event; - NextEvent(&event); - - switch (event.type) + while (NextValidEvent(&event)) { - case EVENT_BUTTONPRESS: - case EVENT_BUTTONRELEASE: - case EVENT_MOTIONNOTIFY: + switch (event.type) { - if (event.type == EVENT_MOTIONNOTIFY) + case EVENT_BUTTONPRESS: + case EVENT_BUTTONRELEASE: + case EVENT_MOTIONNOTIFY: { - if (!PointerInWindow(window)) - continue; /* window and pointer are on different screens */ - - if (!button_status) - continue; - - motion_status = TRUE; - mx = ((MotionEvent *) &event)->x; - my = ((MotionEvent *) &event)->y; - } - else - { - motion_status = FALSE; - mx = ((ButtonEvent *) &event)->x; - my = ((ButtonEvent *) &event)->y; - if (event.type == EVENT_BUTTONPRESS) - button_status = ((ButtonEvent *) &event)->button; + if (event.type == EVENT_MOTIONNOTIFY) + { + if (!PointerInWindow(window)) + continue; /* window and pointer on different screens */ + + if (!button_status) + continue; + + motion_status = TRUE; + mx = ((MotionEvent *) &event)->x; + my = ((MotionEvent *) &event)->y; + } else - button_status = MB_RELEASED; - } - - /* this sets 'request_gadget_id' */ - HandleGadgets(mx, my, button_status); - - switch (request_gadget_id) - { - case TOOL_CTRL_ID_YES: - result = TRUE; - break; - case TOOL_CTRL_ID_NO: - result = FALSE; - break; - case TOOL_CTRL_ID_CONFIRM: - result = TRUE | FALSE; - break; - - case TOOL_CTRL_ID_PLAYER_1: - result = 1; - break; - case TOOL_CTRL_ID_PLAYER_2: - result = 2; - break; - case TOOL_CTRL_ID_PLAYER_3: - result = 3; - break; - case TOOL_CTRL_ID_PLAYER_4: - result = 4; - break; - - default: - break; + { + motion_status = FALSE; + mx = ((ButtonEvent *) &event)->x; + my = ((ButtonEvent *) &event)->y; + if (event.type == EVENT_BUTTONPRESS) + button_status = ((ButtonEvent *) &event)->button; + else + button_status = MB_RELEASED; + } + + /* this sets 'request_gadget_id' */ + HandleGadgets(mx, my, button_status); + + switch (request_gadget_id) + { + case TOOL_CTRL_ID_YES: + result = TRUE; + break; + case TOOL_CTRL_ID_NO: + result = FALSE; + break; + case TOOL_CTRL_ID_CONFIRM: + result = TRUE | FALSE; + break; + + case TOOL_CTRL_ID_PLAYER_1: + result = 1; + break; + case TOOL_CTRL_ID_PLAYER_2: + result = 2; + break; + case TOOL_CTRL_ID_PLAYER_3: + result = 3; + break; + case TOOL_CTRL_ID_PLAYER_4: + result = 4; + break; + + default: + break; + } + + break; } - break; - } - - case EVENT_KEYPRESS: - switch (GetEventKey((KeyEvent *)&event, TRUE)) - { - case KSYM_space: - if (req_state & REQ_CONFIRM) - result = 1; - break; + case EVENT_KEYPRESS: + switch (GetEventKey((KeyEvent *)&event, TRUE)) + { + case KSYM_space: + if (req_state & REQ_CONFIRM) + result = 1; + break; - case KSYM_Return: + case KSYM_Return: #if defined(TARGET_SDL2) - case KSYM_Menu: + case KSYM_Menu: #endif - result = 1; - break; + result = 1; + break; - case KSYM_Escape: + case KSYM_Escape: #if defined(TARGET_SDL2) - case KSYM_Back: + case KSYM_Back: #endif - result = 0; - break; + result = 0; + break; - default: - break; - } + default: + break; + } - if (req_state & REQ_PLAYER) - result = 0; - break; + if (req_state & REQ_PLAYER) + result = 0; + break; - case EVENT_KEYRELEASE: - ClearPlayerAction(); - break; + case EVENT_KEYRELEASE: + ClearPlayerAction(); + break; - default: - HandleOtherEvents(&event); - break; + default: + HandleOtherEvents(&event); + break; + } } } else if (AnyJoystickButton() == JOY_BUTTON_NEW_PRESSED) @@ -4184,6 +4195,8 @@ unsigned int MoveDoor(unsigned int door_state) } } + max_step_delay = MAX(1, max_step_delay); // prevent division by zero + num_move_steps = max_move_delay / max_step_delay; num_move_steps_doors_only = max_move_delay_doors_only / max_step_delay; @@ -4204,6 +4217,8 @@ unsigned int MoveDoor(unsigned int door_state) for (k = start; k < num_move_steps; k++) { + int last_frame = num_move_steps - 1; // last frame of this "for" loop + door_part_done_all = TRUE; for (i = 0; i < NUM_DOORS; i++) @@ -4362,7 +4377,7 @@ unsigned int MoveDoor(unsigned int door_state) if (game_status == GAME_MODE_MAIN) DoAnimation(); - WaitUntilDelayReached(&door_delay, door_delay_value); + SkipUntilDelayReached(&door_delay, door_delay_value, &k, last_frame); current_move_delay += max_step_delay; } @@ -7791,13 +7806,61 @@ void InitGraphicInfo_EM(void) #endif } +void CheckSaveEngineSnapshot_EM(byte action[MAX_PLAYERS], int frame, + boolean any_player_moving, + boolean any_player_snapping, + boolean any_player_dropping) +{ + static boolean player_was_waiting = TRUE; + + if (frame == 0 && !any_player_dropping) + { + if (!player_was_waiting) + { + if (!SaveEngineSnapshotToList()) + return; + + player_was_waiting = TRUE; + } + } + else if (any_player_moving || any_player_snapping || any_player_dropping) + { + player_was_waiting = FALSE; + } +} + +void CheckSaveEngineSnapshot_SP(boolean murphy_is_waiting, + boolean murphy_is_dropping) +{ + static boolean player_was_waiting = TRUE; + + if (murphy_is_waiting) + { + if (!player_was_waiting) + { + if (!SaveEngineSnapshotToList()) + return; + + player_was_waiting = TRUE; + } + } + else + { + player_was_waiting = FALSE; + } +} + void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, boolean any_player_moving, - boolean player_is_dropping) + boolean any_player_snapping, + boolean any_player_dropping) { if (tape.single_step && tape.recording && !tape.pausing) - if (frame == 0 && !player_is_dropping) + if (frame == 0 && !any_player_dropping) TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + + CheckSaveEngineSnapshot_EM(action, frame, any_player_moving, + any_player_snapping, any_player_dropping); } void CheckSingleStepMode_SP(boolean murphy_is_waiting, @@ -7806,6 +7869,8 @@ void CheckSingleStepMode_SP(boolean murphy_is_waiting, if (tape.single_step && tape.recording && !tape.pausing) if (murphy_is_waiting) TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + + CheckSaveEngineSnapshot_SP(murphy_is_waiting, murphy_is_dropping); } void getGraphicSource_SP(struct GraphicInfo_SP *g_sp, @@ -8077,7 +8142,7 @@ void ChangeViewportPropertiesIfNeeded() // printf("::: new_tilesize_var != TILESIZE_VAR\n"); // changing tile size invalidates scroll values of engine snapshots - FreeEngineSnapshot(); + FreeEngineSnapshotSingle(); // changing tile size requires update of graphic mapping for EM engine init_em_graphics = TRUE;