X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=9a712934ac5cf3a9344bd61244273bdfe4ff5d83;hb=8027f83cb6288618be3892b268760f25ca252606;hp=82fb4d0c34425e5a0b81a0d20384a0c876d349da;hpb=1d3eff06cde10309320341fa92abec5b14f1c6f6;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 82fb4d0c..9a712934 100644 --- a/src/tools.c +++ b/src/tools.c @@ -304,6 +304,65 @@ void DrawMaskedBorder(int redraw_mask) } } +void BlitScreenToBitmap(Bitmap *target_bitmap) +{ + DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field); + int fx = FX, fy = FY; + +#if NEW_TILESIZE + int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + + int bx1, bx2, ffx, ffy; + + // fx += dx * TILESIZE_VAR / TILESIZE; + // fy += dy * TILESIZE_VAR / TILESIZE; +#else + fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); +#endif + + /* !!! THIS WORKS !!! */ + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + 2 * TILEX_VAR / 2) + { + fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2) + + 1 * TILEX_VAR; + } + else + { + fx = fx - (dx <= 0 ? TILEX_VAR : 0) + 1 * TILEX_VAR; + + printf("::: STOPPED\n"); + } + + printf("::: %d (%d, %d) [%d] [%d] => %d\n", + ffx, SBX_Left * TILEX_VAR, SBX_Right * TILEX_VAR, dx, FX, fx); + } + + if (border.draw_masked[GAME_MODE_PLAYING]) + { + if (buffer != backbuffer) + { + /* copy playfield buffer to backbuffer to add masked border */ + BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); + DrawMaskedBorder(REDRAW_FIELD); + } + + BlitBitmap(backbuffer, target_bitmap, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, + REAL_SX, REAL_SY); + } + else + { + BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); + } +} + void BackToFront() { int x, y; @@ -407,16 +466,117 @@ void BackToFront() int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); - fx += dx * TILESIZE_VAR / TILESIZE; - fy += dy * TILESIZE_VAR / TILESIZE; + int bx1, bx2, ffx, ffy; + + // fx += dx * TILESIZE_VAR / TILESIZE; + // fy += dy * TILESIZE_VAR / TILESIZE; #else fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); #endif +#if 1 + +#if 0 + bx1 = SBX_Left * TILEX_VAR + TILEX_VAR / 2; + // bx1 = SBX_Left * TILEX_VAR; + bx2 = SBX_Right * TILEX_VAR - TILEX_VAR / 2; + ffx = scroll_x * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + + if (ffx > bx1) // && ffx < bx2) + fx += dx * TILESIZE_VAR / TILESIZE; + + // fx += TILEX_VAR - (ffx - bx1) % TILEX_VAR; + + printf("::: %d (%d, %d) (%d)\n", ffx, bx1, bx2, dx); + +#if 0 + if (ffx > SBX_Left * TILEX_VAR) + fx -= MIN(ffx, TILEX_VAR / 2); + if (ffx > SBX_Left * TILEX_VAR && ffx < (SBX_Right + 1) * TILEX_VAR) + fx -= MIN(ffx, TILEX_VAR / 2); +#endif + +#else + +#if 0 + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2) + fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2); + else + fx = fx - (dx <= 0 ? TILEX_VAR : 0); + + printf("::: %d (%d, %d) [%d] [%d] => %d\n", + ffx, SBX_Left * TILEX_VAR, SBX_Right * TILEX_VAR, dx, FX, fx); + } +#else + +#if 0 + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + 0 * TILEX_VAR / 2) + { + fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2) + + 1 * TILEX_VAR; + } + else + { + fx = fx - (dx <= 0 ? TILEX_VAR : 0) + 1 * TILEX_VAR; + + printf("::: STOPPED\n"); + } + + printf("::: %d (%d, %d) [%d] [%d] => %d\n", + ffx, SBX_Left * TILEX_VAR, SBX_Right * TILEX_VAR, dx, FX, fx); + } +#else + /* !!! THIS WORKS !!! */ + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + 2 * TILEX_VAR / 2) + { + fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2) + + 1 * TILEX_VAR; + } + else + { + fx = fx - (dx <= 0 ? TILEX_VAR : 0) + 1 * TILEX_VAR; + + printf("::: STOPPED\n"); + } + + printf("::: %d (%d, %d) [%d] [%d] [%d, %d] => %d\n", + ffx, SBX_Left * TILEX_VAR, SBX_Right * TILEX_VAR, + dx, FX, ScreenMovDir, ScreenGfxPos, fx); + } + else + { + fx += dx; + } + + fy += dy; +#endif + +#endif + +#endif + #if 0 - printf("::: %d, %d [%d, %d] [%d, %d]\n", - fx, fy, FX, FY, ScreenMovDir, ScreenGfxPos); + printf("::: %d, %d [%d, %d] [%d, %d] [%d, %d] [%d] [%d, %d]\n", + fx, fy, FX, FY, ScreenMovDir, ScreenGfxPos, + scroll_x, scroll_y, + ffx, + SBX_Left, SBX_Right); +#endif + #endif #if 0 @@ -498,6 +658,49 @@ void BackToFront() #endif #if NEW_TILESIZE + +#if 1 + InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE); + + { + int sx = SX; // - (EVEN(SCR_FIELDX) ? TILEX_VAR / 2 : 0); + int sy = SY; // + (EVEN(SCR_FIELDY) ? TILEY_VAR / 2 : 0); + + int dx = 0, dy = 0; + int ffx, ffy; + int fx = FX, fy = FY; + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + 2 * TILEX_VAR / 2) + { + fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2) + + 1 * TILEX_VAR; + + if (fx % TILEX_VAR) + sx -= TILEX_VAR / 2; + else + sx -= TILEX_VAR; + } + else + { + fx = fx - (dx <= 0 ? TILEX_VAR : 0) + 1 * TILEX_VAR; + } + } + + 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, + TILEX_VAR, TILEY_VAR, + sx + x * TILEX_VAR, sy + y * TILEY_VAR); + } + + InitGfxClipRegion(FALSE, -1, -1, -1, -1); +#else for (x = 0; x < SCR_FIELDX; x++) for (y = 0 ; y < SCR_FIELDY; y++) if (redraw[redraw_x1 + x][redraw_y1 + y]) @@ -505,6 +708,8 @@ void BackToFront() FX + x * TILEX_VAR, FY + y * TILEY_VAR, TILEX_VAR, TILEY_VAR, SX + x * TILEX_VAR, SY + y * TILEY_VAR); +#endif + #else for (x = 0; x < SCR_FIELDX; x++) for (y = 0 ; y < SCR_FIELDY; y++) @@ -8831,17 +9036,27 @@ void ChangeViewportPropertiesIfNeeded() int border_size = vp_playfield->border_size; int new_sx = vp_playfield->x + border_size; int new_sy = vp_playfield->y + border_size; - int tilesize = (gfx_game_mode == GAME_MODE_PLAYING ? TILESIZE_VAR : - gfx_game_mode == GAME_MODE_EDITOR ? MINI_TILESIZE : TILESIZE); int new_sxsize = vp_playfield->width - 2 * border_size; int new_sysize = vp_playfield->height - 2 * border_size; + int new_real_sx = vp_playfield->x; + int new_real_sy = vp_playfield->y; + int new_full_sxsize = vp_playfield->width; + int new_full_sysize = vp_playfield->height; #if NEW_TILESIZE + int new_tilesize_var = TILESIZE / (setup.small_game_graphics ? 2 : 1); + int tilesize = (gfx_game_mode == GAME_MODE_PLAYING ? new_tilesize_var : + gfx_game_mode == GAME_MODE_EDITOR ? MINI_TILESIZE : TILESIZE); int new_scr_fieldx = new_sxsize / tilesize; int new_scr_fieldy = new_sysize / tilesize; + int new_scr_fieldx_buffers = new_sxsize / new_tilesize_var; + int new_scr_fieldy_buffers = new_sysize / new_tilesize_var; #else int new_scr_fieldx = (vp_playfield->width - 2 * border_size) / TILESIZE; int new_scr_fieldy = (vp_playfield->height - 2 * border_size) / TILESIZE; #endif + boolean init_gfx_buffers = FALSE; + boolean init_video_buffer = FALSE; + boolean init_gadgets_and_toons = FALSE; #if 0 /* !!! TEST ONLY !!! */ @@ -8855,6 +9070,10 @@ void ChangeViewportPropertiesIfNeeded() WIN_XSIZE = viewport.window.width; WIN_YSIZE = viewport.window.height; +#if 1 + init_video_buffer = TRUE; + init_gfx_buffers = TRUE; +#else InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); InitGfxBuffers(); @@ -8864,45 +9083,123 @@ void ChangeViewportPropertiesIfNeeded() // RedrawBackground(); #endif +#endif + + // printf("::: video: init_video_buffer, init_gfx_buffers\n"); } if (new_scr_fieldx != SCR_FIELDX || - new_scr_fieldy != SCR_FIELDY || - new_sx != SX || + new_scr_fieldy != SCR_FIELDY) + { + /* this always toggles between MAIN and GAME when using small tile size */ + + SCR_FIELDX = new_scr_fieldx; + SCR_FIELDY = new_scr_fieldy; + + // printf("::: new_scr_fieldx != SCR_FIELDX ...\n"); + } + +#if 0 + if (new_tilesize_var != TILESIZE_VAR && + gfx_game_mode == GAME_MODE_PLAYING) + { + /* doing this outside GAME_MODE_PLAYING would give wrong playfield size */ + + TILESIZE_VAR = new_tilesize_var; + + init_gfx_buffers = TRUE; + + // printf("::: tilesize: init_gfx_buffers\n"); + } +#endif + + if (new_sx != SX || new_sy != SY || - vp_playfield->x != REAL_SX || - vp_playfield->y != REAL_SY || + new_sxsize != SXSIZE || + new_sysize != SYSIZE || + new_real_sx != REAL_SX || + new_real_sy != REAL_SY || + new_full_sxsize != FULL_SXSIZE || + new_full_sysize != FULL_SYSIZE || + new_tilesize_var != TILESIZE_VAR || vp_door_1->x != *door_1_x || vp_door_1->y != *door_1_y || vp_door_2->x != *door_2_x || vp_door_2->y != *door_2_y) { - SCR_FIELDX = new_scr_fieldx; - SCR_FIELDY = new_scr_fieldy; SX = new_sx; SY = new_sy; - REAL_SX = vp_playfield->x; - REAL_SY = vp_playfield->y; - SXSIZE = new_sxsize; SYSIZE = new_sysize; - FULL_SXSIZE = vp_playfield->width; - FULL_SYSIZE = vp_playfield->width; + REAL_SX = new_real_sx; + REAL_SY = new_real_sy; + FULL_SXSIZE = new_full_sxsize; + FULL_SYSIZE = new_full_sysize; + TILESIZE_VAR = new_tilesize_var; + +#if 0 + printf("::: %d, %d, %d [%d]\n", + SCR_FIELDX, SCR_FIELDY, TILESIZE_VAR, + setup.small_game_graphics); +#endif *door_1_x = vp_door_1->x; *door_1_y = vp_door_1->y; *door_2_x = vp_door_2->x; *door_2_y = vp_door_2->y; +#if 1 + init_gfx_buffers = TRUE; + + // printf("::: viewports: init_gfx_buffers\n"); +#else InitGfxBuffers(); +#endif if (gfx_game_mode == GAME_MODE_MAIN) { +#if 1 + init_gadgets_and_toons = TRUE; + + // printf("::: viewports: init_gadgets_and_toons\n"); +#else InitGadgets(); InitToons(); +#endif } } + if (init_gfx_buffers) + { + // printf("::: init_gfx_buffers\n"); + + SCR_FIELDX = new_scr_fieldx_buffers; + SCR_FIELDY = new_scr_fieldy_buffers; + + InitGfxBuffers(); + + SCR_FIELDX = new_scr_fieldx; + SCR_FIELDY = new_scr_fieldy; + } + + if (init_video_buffer) + { + // printf("::: init_video_buffer\n"); + + InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); + + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); + } + + if (init_gadgets_and_toons) + { + // printf("::: init_gadgets_and_toons\n"); + + InitGadgets(); + InitToons(); + } + #if 0 printf("::: %d, %d / %d, %d [%d]\n", VX, VY, EX, EY, game_status); #endif