X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=bd71d0c5a3f275e71a3397a7b8f9fd0d4166d989;hb=6e022fe74edcab8e9b6be32bcfdd7006f478e2ab;hp=ba0ec81ca5ffe036047f565321ccb0f5793cfe47;hpb=205e33df255a817dc1032696f065256a08aa61fa;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index ba0ec81c..bd71d0c5 100644 --- a/src/tools.c +++ b/src/tools.c @@ -323,13 +323,6 @@ void BlitScreenToBitmap(Bitmap *target_bitmap) fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); #endif - /* !!! THIS WORKS !!! */ - - printf("::: (%d, %d) [(%d / %d, %d / %d)]\n", - scroll_x, scroll_y, - SBX_Left, SBX_Right, - SBY_Upper, SBY_Lower); - ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; @@ -338,11 +331,11 @@ void BlitScreenToBitmap(Bitmap *target_bitmap) if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; else - fx += (dx > 0 ? TILEX_VAR : 0); + fx += (dx_var > 0 ? TILEX_VAR : 0); } else { - fx += dx; + fx += dx_var; } if (EVEN(SCR_FIELDY)) @@ -350,13 +343,21 @@ void BlitScreenToBitmap(Bitmap *target_bitmap) if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR; else - fy += (dy > 0 ? TILEY_VAR : 0); + fy += (dy_var > 0 ? TILEY_VAR : 0); } else { - fy += dy; + fy += dy_var; } +#if 0 + printf("::: (%d, %d) [(%d / %d, %d / %d)] => %d, %d\n", + scroll_x, scroll_y, + SBX_Left, SBX_Right, + SBY_Upper, SBY_Lower, + fx, fy); +#endif + if (border.draw_masked[GAME_MODE_PLAYING]) { if (buffer != backbuffer) @@ -394,12 +395,45 @@ void BackToFront() if (redraw_mask & REDRAW_TILES && redraw_tiles > REDRAWTILES_THRESHOLD) redraw_mask |= REDRAW_FIELD; +#if 0 + // never redraw single tiles, always redraw the whole field + // (redrawing single tiles up to a certain threshold was faster on old, + // now legacy graphics, but slows things down on modern graphics now) + // UPDATE: this is now globally defined by value of REDRAWTILES_THRESHOLD + if (redraw_mask & REDRAW_TILES) + redraw_mask |= REDRAW_FIELD; +#endif + +#if 0 + /* !!! TEST ONLY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ + /* (force full redraw) */ + if (game_status == GAME_MODE_PLAYING) + redraw_mask |= REDRAW_FIELD; +#endif + if (redraw_mask & REDRAW_FIELD) redraw_mask &= ~REDRAW_TILES; if (redraw_mask == REDRAW_NONE) return; +#if 0 + printf("::: "); + if (redraw_mask & REDRAW_ALL) + printf("[REDRAW_ALL]"); + if (redraw_mask & REDRAW_FIELD) + printf("[REDRAW_FIELD]"); + if (redraw_mask & REDRAW_TILES) + printf("[REDRAW_TILES]"); + if (redraw_mask & REDRAW_DOOR_1) + printf("[REDRAW_DOOR_1]"); + if (redraw_mask & REDRAW_DOOR_2) + printf("[REDRAW_DOOR_2]"); + if (redraw_mask & REDRAW_FROM_BACKBUFFER) + printf("[REDRAW_FROM_BACKBUFFER]"); + printf(" [%d]\n", FrameCounter); +#endif + if (redraw_mask & REDRAW_TILES && game_status == GAME_MODE_PLAYING && border.draw_masked[GAME_MODE_PLAYING]) @@ -596,18 +630,22 @@ void BackToFront() int sy = SY; // + (EVEN(SCR_FIELDY) ? TILEY_VAR / 2 : 0); int dx = 0, dy = 0; + int dx_var = dx * TILESIZE_VAR / TILESIZE; + int dy_var = dy * TILESIZE_VAR / TILESIZE; int ffx, ffy; int fx = FX, fy = FY; - ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; - ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy * TILESIZE_VAR / TILESIZE; + int scr_fieldx = SCR_FIELDX + (EVEN(SCR_FIELDX) ? 2 : 0); + int scr_fieldy = SCR_FIELDY + (EVEN(SCR_FIELDY) ? 2 : 0); + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; + ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; if (EVEN(SCR_FIELDX)) { if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) { - fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2) + - TILEX_VAR; + fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; if (fx % TILEX_VAR) sx -= TILEX_VAR / 2; @@ -616,7 +654,7 @@ void BackToFront() } else { - fx = fx - (dx <= 0 ? TILEX_VAR : 0) + TILEX_VAR; + fx += (dx_var > 0 ? TILEX_VAR : 0); } } @@ -624,8 +662,7 @@ void BackToFront() { if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) { - fy = fy + dy * TILESIZE_VAR / TILESIZE - MIN(ffy, TILEY_VAR / 2) + - TILEY_VAR; + fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR; if (fy % TILEY_VAR) sy -= TILEY_VAR / 2; @@ -634,12 +671,16 @@ void BackToFront() } else { - fy = fy - (dy <= 0 ? TILEY_VAR : 0) + TILEY_VAR; + fy += (dy_var > 0 ? TILEY_VAR : 0); } } - for (x = 0; x < SCR_FIELDX; x++) - for (y = 0 ; y < SCR_FIELDY; y++) +#if 0 + printf("::: %d, %d, %d, %d\n", sx, sy, SCR_FIELDX, SCR_FIELDY); +#endif + + for (x = 0; x < scr_fieldx; x++) + for (y = 0 ; y < scr_fieldy; y++) if (redraw[redraw_x1 + x][redraw_y1 + y]) BlitBitmap(buffer, window, FX + x * TILEX_VAR, FY + y * TILEY_VAR, @@ -1046,7 +1087,18 @@ void DrawBackground(int x, int y, int width, int height) ClearRectangleOnBackground(backbuffer, x, y, width, height); #endif +#if 1 + /* (this only works for the current arrangement of playfield and panels) */ + if (x < gfx.dx) + redraw_mask |= REDRAW_FIELD; + else if (y < gfx.vy) + redraw_mask |= REDRAW_DOOR_1; + else + redraw_mask |= REDRAW_DOOR_2; +#else + /* (this is just wrong (when drawing to one of the two door panel areas)) */ redraw_mask |= REDRAW_FIELD; +#endif } void DrawBackgroundForFont(int x, int y, int width, int height, int font_nr) @@ -2463,7 +2515,7 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND); boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); - unsigned long anim_delay = 0; + unsigned int anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); int anim_delay_value = (no_delay ? 0 : frame_delay_value); int font_nr = FONT_ENVELOPE_1 + envelope_nr; @@ -2525,7 +2577,7 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND); boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); - unsigned long anim_delay = 0; + unsigned int anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); int anim_delay_value = (no_delay ? 0 : frame_delay_value); #if 1 @@ -3035,11 +3087,11 @@ static void DrawPreviewLevelLabelExt(int mode) void DrawPreviewLevel(boolean restart) { - static unsigned long scroll_delay = 0; - static unsigned long label_delay = 0; + static unsigned int scroll_delay = 0; + static unsigned int label_delay = 0; static int from_x, from_y, scroll_direction; static int label_state, label_counter; - unsigned long scroll_delay_value = preview.step_delay; + unsigned int scroll_delay_value = preview.step_delay; boolean show_level_border = (BorderElement != EL_EMPTY); int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); @@ -4120,6 +4172,9 @@ boolean Request(char *text, unsigned int req_state) break; case KSYM_Escape: +#if defined(TARGET_SDL2) + case KSYM_Back: +#endif result = 0; break; @@ -4293,8 +4348,8 @@ unsigned int MoveDoor(unsigned int door_state) { static int door1 = DOOR_OPEN_1; static int door2 = DOOR_CLOSE_2; - unsigned long door_delay = 0; - unsigned long door_delay_value; + unsigned int door_delay = 0; + unsigned int door_delay_value; int stepsize = 1; if (door_1.width < 0 || door_1.width > DXSIZE) @@ -4713,7 +4768,7 @@ void CreateToolButtons() Bitmap *deco_bitmap = None; int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0; struct GadgetInfo *gi; - unsigned long event_mask; + unsigned int event_mask; int gd_xoffset, gd_yoffset; int gd_x1, gd_x2, gd_y; int id = i; @@ -7196,7 +7251,7 @@ int getGameFrameDelay_EM(int native_em_game_frame_delay) return game_frame_delay_value; } -unsigned int InitRND(long seed) +unsigned int InitRND(int seed) { if (level.game_engine_type == GAME_ENGINE_TYPE_EM) return InitEngineRandom_EM(seed); @@ -8788,15 +8843,16 @@ void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, boolean any_player_moving, boolean player_is_dropping) { - int i; - if (tape.single_step && tape.recording && !tape.pausing) { +#if 0 boolean active_players = FALSE; + int i; for (i = 0; i < MAX_PLAYERS; i++) if (action[i] != JOY_NO_ACTION) active_players = TRUE; +#endif // if (frame == 0) if (frame == 0 && !player_is_dropping)