X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2FDDScrollBuffer.c;h=6df6f1e20c3aa24735e3861a58b3a1a4a646a56e;hb=843029e7c2253a35aa1b4ac87241978808b9e6fc;hp=e11c561c1688311680af260cd98d423265e99c12;hpb=66815b1b9363de7741defc14e5f7f0dc2183781a;p=rocksndiamonds.git diff --git a/src/game_sp/DDScrollBuffer.c b/src/game_sp/DDScrollBuffer.c index e11c561c..6df6f1e2 100644 --- a/src/game_sp/DDScrollBuffer.c +++ b/src/game_sp/DDScrollBuffer.c @@ -40,30 +40,13 @@ boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; int TEST_flag = 0; -static void ScrollPlayfield() +static void ScrollPlayfield(int dx, int dy) { - int sx_last = mScrollX_last / TILEX; - int sy_last = mScrollY_last / TILEY; - int sx = mScrollX / TILEX; - int sy = mScrollY / TILEY; - int dx = (sx < sx_last ? +1 : sx > sx_last ? -1 : 0); - int dy = (sy < sy_last ? +1 : sy > sy_last ? -1 : 0); + int x1 = mScrollX_last / TILEX - 2; + int y1 = mScrollY_last / TILEY - 2; + int x2 = mScrollX_last / TILEX + (SCR_FIELDX - 1) + 2; + int y2 = mScrollY_last / TILEY + (SCR_FIELDY - 1) + 2; int x, y; - int sx1 = mScrollX - TILEX; - int sy1 = mScrollY - TILEY; - int sx2 = mScrollX + SXSIZE + TILEX; - int sy2 = mScrollY + SYSIZE + TILEY; - int x1 = sx1 / TILEX; - int y1 = sy1 / TILEY; - int x2 = sx2 / TILEX; - int y2 = sy2 / TILEY; -#if 1 - int buf_xsize = SCR_FIELDX + 2; - int buf_ysize = SCR_FIELDY + 2; -#else - int buf_xsize = MAX_BUF_XSIZE; - int buf_ysize = MAX_BUF_YSIZE; -#endif BlitBitmap(screenBitmap, screenBitmap, TILEX * (dx == -1), @@ -79,11 +62,15 @@ static void ScrollPlayfield() redraw[x][y] = FALSE; redraw_tiles = 0; +#if 1 + DrawFrameIfNeeded(); +#endif + for (y = DisplayMinY; y <= DisplayMaxY; y++) { for (x = DisplayMinX; x <= DisplayMaxX; x++) { - if (x >= x1 && x < x2 && y >= y1 && y < y2) + if (x >= x1 && x <= x2 && y >= y1 && y <= y2) { int sx = x - x1; int sy = y - y1; @@ -101,12 +88,14 @@ static void ScrollPlayfield() #endif #endif - if ((dx == -1 && sx == buf_xsize - 1) || - (dx == +1 && sx == 0) || - (dy == -1 && sy == buf_ysize - 1) || - (dy == +1 && sy == 0)) + if ((dx == -1 && x == x2) || + (dx == +1 && x == x1) || + (dy == -1 && y == y2) || + (dy == +1 && y == y1)) { +#if 0 printf("::: %d, %d\n", sx, sy); +#endif TEST_flag = 1; @@ -124,12 +113,6 @@ static void ScrollPlayfield() static void ScrollPlayfieldIfNeededExt(boolean reset) { - int sx_last = mScrollX_last / TILEX; - int sy_last = mScrollY_last / TILEY; - int sx = mScrollX / TILEX; - int sy = mScrollY / TILEY; - boolean initialized = (mScrollX_last != -1 && mScrollY_last != -1); - if (reset) { mScrollX_last = -1; @@ -138,7 +121,6 @@ static void ScrollPlayfieldIfNeededExt(boolean reset) return; } -#if 0 if (mScrollX_last == -1 || mScrollY_last == -1) { mScrollX_last = mScrollX; @@ -146,13 +128,50 @@ static void ScrollPlayfieldIfNeededExt(boolean reset) return; } + +#if 1 + + /* check if scrolling the playfield requires redrawing the viewport bitmap */ + if ((mScrollX != mScrollX_last || + mScrollY != mScrollY_last) && + (ABS(mScrollX - mScrollX_last) >= TILEX || + ABS(mScrollY - mScrollY_last) >= TILEY)) + { + int dx = (ABS(mScrollX - mScrollX_last) < TILEX ? 0 : + mScrollX < mScrollX_last ? 1 : mScrollX > mScrollX_last ? -1 : 0); + int dy = (ABS(mScrollY - mScrollY_last) < TILEY ? 0 : + mScrollY < mScrollY_last ? 1 : mScrollY > mScrollY_last ? -1 : 0); + + mScrollX_last -= dx * TILEX; + mScrollY_last -= dy * TILEY; + + ScrollPlayfield(dx, dy); + +#if 0 + printf("::: %ld, %ld\n", mScrollX, mScrollY); #endif + } + +#else - if (initialized && (sx != sx_last || sy != sy_last)) - ScrollPlayfield(); + /* check if scrolling the playfield reached the destination tile position */ + if ((mScrollX != mScrollX_last || mScrollY != mScrollY_last) && + mScrollX % TILEX == 0 && mScrollY % TILEY == 0) + { + int dx = (mScrollX < mScrollX_last ? 1 : mScrollX > mScrollX_last ? -1 : 0); + int dy = (mScrollY < mScrollY_last ? 1 : mScrollY > mScrollY_last ? -1 : 0); + + mScrollX_last = mScrollX; + mScrollY_last = mScrollY; + + ScrollPlayfield(dx, dy); - mScrollX_last = mScrollX; - mScrollY_last = mScrollY; +#if 0 + printf("::: %ld, %ld\n", mScrollX, mScrollY); +#endif + } + +#endif } static void ScrollPlayfieldIfNeeded() @@ -167,21 +186,17 @@ void InitScrollPlayfield() void UpdatePlayfield() { + int x1 = mScrollX_last / TILEX - 2; + int y1 = mScrollY_last / TILEY - 2; + int x2 = mScrollX_last / TILEX + (SCR_FIELDX - 1) + 2; + int y2 = mScrollY_last / TILEY + (SCR_FIELDY - 1) + 2; int x, y; - int sx1 = mScrollX - TILEX; - int sy1 = mScrollY - TILEY; - int sx2 = mScrollX + SXSIZE + TILEX; - int sy2 = mScrollY + SYSIZE + TILEY; - int x1 = sx1 / TILEX; - int y1 = sy1 / TILEY; - int x2 = sx2 / TILEX; - int y2 = sy2 / TILEY; for (y = DisplayMinY; y <= DisplayMaxY; y++) { for (x = DisplayMinX; x <= DisplayMaxX; x++) { - if (x >= x1 && x < x2 && y >= y1 && y < y2) + if (x >= x1 && x <= x2 && y >= y1 && y <= y2) { int sx = x - x1; int sy = y - y1; @@ -348,11 +363,96 @@ void DDScrollBuffer_Cls(int BackColor) void BlitScreenToBitmap_SP(Bitmap *target_bitmap) { - int sx = TILEX + mScrollX % TILEX; - int sy = TILEY + mScrollY % TILEY; +#if 0 + int px = 2 * TILEX + mScrollX % TILEX; + int py = 2 * TILEY + mScrollY % TILEY; +#else + int px = 2 * TILEX + (mScrollX - mScrollX_last) % TILEX; + int py = 2 * TILEY + (mScrollY - mScrollY_last) % TILEY; +#endif + int sx, sy, sxsize, sysize; + +#if 0 + if (mScrollX % TILEX != (mScrollX - mScrollX_last) % TILEX || + mScrollY % TILEY != (mScrollY - mScrollY_last) % TILEY) + printf("::: %ld, %ld / %ld, %ld\n", + mScrollX, mScrollY, mScrollX_last, mScrollY_last); +#endif - BlitBitmap(screenBitmap, target_bitmap, sx, sy, - SCR_FIELDX * TILEX, SCR_FIELDY * TILEY, SX, SY); +#if 1 + int xsize = SXSIZE; + int ysize = SYSIZE; + int full_xsize = (FieldWidth - (menBorder.Checked ? 0 : 1)) * TILEX; + int full_ysize = (FieldHeight - (menBorder.Checked ? 0 : 1)) * TILEY; + + sxsize = (full_xsize < xsize ? full_xsize : xsize); + sysize = (full_ysize < ysize ? full_ysize : ysize); + sx = SX + (full_xsize < xsize ? (xsize - full_xsize) / 2 : 0); + sy = SY + (full_ysize < ysize ? (ysize - full_ysize) / 2 : 0); +#endif + +#if 0 + { + static int mScrollX_tmp = -1; + static int mScrollY_tmp = -1; + + if (mScrollX != mScrollX_tmp || mScrollY != mScrollY_tmp) + { + printf("::: %ld, %ld\n", mScrollX, mScrollY); + + mScrollX_tmp = mScrollX; + mScrollY_tmp = mScrollY; + } + } +#endif + +#if 0 + { + static boolean x = 0; + + if (x == 0) + { + printf("::: %d, %d (%d, %d) (%d, %d) [%ld, %ld] [%ld, %ld] \n", + sx, sy, xsize, ysize, full_xsize, full_ysize, + mScrollX, mScrollY, mScrollX_last, mScrollY_last); + + x = 1; + } + } +#endif + +#if 1 + if (!menBorder.Checked) + { + px += TILEX / 2; + py += TILEY / 2; + } +#endif + +#if 0 + if (mScrollX >= 0 && mScrollX <= 16) + { + px -= mScrollX; + } +#if 0 + else if (mScrollX >= 352 && mScrollX <= 368) + { + px -= mScrollX; + } +#endif + else if (mScrollX >= 16) // && mScrollX <= 352) + { + px -= TILEX / 2; + } +#endif + +#if 0 + /* !!! TEST ONLY !!! */ + px = py = 0; + sx = sy = SX; +#endif + + BlitBitmap(screenBitmap, target_bitmap, px, py, sxsize, sysize, sx, sy); } void OLD_BlitScreenToBitmap_SP(Bitmap *target_bitmap) @@ -413,11 +513,15 @@ void BackToFront_SP(void) if (1 || redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last) { +#if 1 + BlitScreenToBitmap_SP(window); +#else /* blit all (up to four) parts of the scroll buffer to the backbuffer */ BlitScreenToBitmap_SP(backbuffer); /* blit the completely updated backbuffer to the window (in one blit) */ BlitBitmap(backbuffer, window, SX, SY, SXSIZE, SYSIZE, SX, SY); +#endif } else { @@ -521,8 +625,8 @@ void DDScrollBuffer_Blt_Ext(Bitmap *target_bitmap) #if 1 if (!menBorder.Checked) { - SR.left += 16; - SR.top += 16; + SR.left += TILEX / 2; + SR.top += TILEY / 2; } #endif @@ -720,8 +824,8 @@ void DDScrollBuffer_ScrollTowards(int X, int Y, double Step) return; #if 0 - printf("::: DDScrollBuffer.c: DDScrollBuffer_ScrollTowards(): (1) mScroll: %ld, %ld [%d, %d, %f]\n", - mScrollX, mScrollY, X, Y, Step); + printf("::: DDScrollBuffer.c: DDScrollBuffer_ScrollTowards(): (1) mScroll: %ld, %ld [%d, %d, %f, %f]\n", + mScrollX, mScrollY, X, Y, Step, Stretch); #endif X = X / Stretch;