X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2FDDSpriteBuffer.c;h=36d271f1818d4f0ca0c023b8dd0fd9dbc7e1dc3f;hb=18863a5655e9e07d548e2d673e7f82336703c8fb;hp=5ab338fb26cd020f0610c6dce128ec00802979d7;hpb=8d3d7d213a9691455a49544624bf380e85f43461;p=rocksndiamonds.git diff --git a/src/game_sp/DDSpriteBuffer.c b/src/game_sp/DDSpriteBuffer.c index 5ab338fb..36d271f1 100644 --- a/src/game_sp/DDSpriteBuffer.c +++ b/src/game_sp/DDSpriteBuffer.c @@ -4,7 +4,7 @@ #include "DDSpriteBuffer.h" -static void Blt(int pX, int pY, int SpriteX, int SpriteY); +static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY); // --- VERSION 1.0 CLASS // --- BEGIN @@ -106,14 +106,23 @@ boolean DDSpriteBuffer_CreateFromFile(char *Path, long xSprites, long ySprites) } // --- On Error GoTo CreateFromFileEH +#if 1 + SD.LWidth = 16 * TILEX; + SD.LHeight = 16 * TILEY; +#else Buffer = DDraw.CreateSurfaceFromFile(Path, SD); +#endif // --- On Error GoTo 0 +#if 0 Buffer.GetSurfaceDesc(SD); +#endif + mSpriteWidth = SD.LWidth / xSprites; mSpriteHeight = SD.LHeight / ySprites; mXSpriteCount = xSprites; mYSpriteCount = ySprites; + CreateFromFile = True; return CreateFromFile; @@ -123,6 +132,8 @@ boolean DDSpriteBuffer_CreateFromFile(char *Path, long xSprites, long ySprites) return CreateFromFile; } +#if 0 + boolean DDSpriteBuffer_CreateAtSize(long Width, long Height, long xSprites, long ySprites) { boolean CreateAtSize; @@ -154,6 +165,10 @@ boolean DDSpriteBuffer_CreateAtSize(long Width, long Height, long xSprites, long return CreateAtSize; } +#endif + +#if 0 + void DDSpriteBuffer_Cls(int BackColor) { RECT EmptyRect; @@ -161,14 +176,160 @@ void DDSpriteBuffer_Cls(int BackColor) Buffer.BltColorFill(EmptyRect, BackColor); } -static void Blt(int pX, int pY, int SpriteX, int SpriteY) +#endif + +static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY) +{ + MyRECT DR, SR; +#if 0 + long Tmp; +#endif + +#if 1 + + int scx = (mScrollX_last < 0 ? 0 : mScrollX_last); + int scy = (mScrollY_last < 0 ? 0 : mScrollY_last); + int sx1 = scx - 2 * TILEX; + int sy1 = scy - 2 * TILEY; + int sx2 = scx + SXSIZE + 1 * TILEX; + int sy2 = scy + SYSIZE + 1 * TILEY; + + int sx = pX - sx1; + int sy = pY - sy1; + +#else + + 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; + +#if 0 + int x2 = sx2 / TILEX; + int y2 = sy2 / TILEY; +#endif + + int sx = pX - x1 * TILEX; + int sy = pY - y1 * TILEY; + +#endif + +#if 0 + printf(":1: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld]\n", + pX, pY, mScrollX, mScrollY); +#endif + + if (NoDisplayFlag) + return; + +#if 0 + if (TEST_flag) + { + if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2) + printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%d..%d, %d..%d] (%ld, %ld) (%ld, %ld) [SKIPPED]\n", + pX, pY, sx1, sx2, sy1, sy2, mScrollX, mScrollY, mScrollX_last, mScrollY_last); + else + printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%d..%d, %d..%d] (%ld, %ld) (%ld, %ld)\n", + pX, pY, sx1, sx2, sy1, sy2, mScrollX, mScrollY, mScrollX_last, mScrollY_last); + } +#endif + + /* do not draw fields that are outside the visible screen area */ + if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2) + return; + +#if 0 + printf(":2: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld]\n", + pX, pY, mScrollX, mScrollY); +#endif + + { + DR.left = pX + mDestXOff; + DR.top = pY + mDestYOff; + DR.right = pX + mSpriteWidth + mDestXOff; + DR.bottom = pY + mSpriteHeight + mDestYOff; + } + { +#if 1 + SR.left = SpriteX; + SR.top = SpriteY; +#else + SR.left = mSpriteWidth * (SpriteX - 1); + SR.top = mSpriteHeight * (SpriteY - 1); +#endif + SR.right = SR.left + mSpriteWidth; + SR.bottom = SR.top + mSpriteHeight; + } + +#if 0 + printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", DR.left, DR.top); +#endif + +#if 0 + printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", sx, sy); +#endif + +#if 0 + if (pX == 0 * StretchWidth && pY == 0 * StretchWidth) + printf("::: TEST: drawing topleft corner ...\n"); + if (pX == 59 * StretchWidth && pY == 23 * StretchWidth) + printf("::: TEST: drawing bottomright corner ...\n"); +#endif + +#if 1 + +#if 1 + BlitBitmap(bitmap, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + sx, sy); +#else + BlitBitmap(sp_objects, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + DR.left, DR.top); +#endif + +#else + Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT); +#endif +} + +#if 0 + +static void OLD_Blt(int pX, int pY, int SpriteX, int SpriteY) { RECT DR, SR; +#if 0 long Tmp; +#endif + +#if 1 + int left = mScrollX; + int top = mScrollY; +#else + int left = mScrollX / TILEX; + int top = mScrollY / TILEY; +#endif + + int sx = pX % (MAX_BUF_XSIZE * TILEX); + int sy = pY % (MAX_BUF_YSIZE * TILEY); + +#if 0 + printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld] [%d, %d]\n", + pX, pY, mScrollX, mScrollY, left, top); +#endif if (NoDisplayFlag) return; + /* do not draw fields that are outside the visible screen area */ + if (pX < left || pX >= left + MAX_BUF_XSIZE * TILEX || + pY < top || pY >= top + MAX_BUF_YSIZE * TILEY) + return; + { DR.left = pX + mDestXOff; DR.top = pY + mDestYOff; @@ -181,9 +342,41 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY) SR.right = SR.left + mSpriteWidth; SR.bottom = SR.top + mSpriteHeight; } + +#if 0 + printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", DR.left, DR.top); +#endif + +#if 0 + if (pX == 0 * StretchWidth && pY == 0 * StretchWidth) + printf("::: TEST: drawing topleft corner ...\n"); + if (pX == 59 * StretchWidth && pY == 23 * StretchWidth) + printf("::: TEST: drawing bottomright corner ...\n"); +#endif + +#if 1 + +#if 1 + BlitBitmap(sp_objects, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + sx, sy); +#else + BlitBitmap(sp_objects, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + DR.left, DR.top); +#endif + +#else Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT); +#endif } +#endif + +#if 0 + void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos) { int XPos, YPos; @@ -191,9 +384,43 @@ void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos) if (NoDisplayFlag) return; +#if 1 + XPos = mSpriteWidth * (SpritePos % mXSpriteCount); + YPos = mSpriteHeight * (SpritePos / mXSpriteCount); +#else XPos = (SpritePos % mXSpriteCount) + 1; YPos = (SpritePos / mXSpriteCount) + 1; - Blt(pX, pY, XPos, YPos); +#endif + +#if 0 + printf("::: BltEx: %d, %d, %d, %d\n", pX, pY, XPos, YPos); +#endif + +#if 0 + if (TEST_flag) + printf("::: DDSpriteBuffer_BltEx(): %d, %d [%d]\n", + pX, pY, SpritePos); +#endif + + Blt(pX, pY, sp_objects, XPos, YPos); +} + +#endif + +void DDSpriteBuffer_BltImg(int pX, int pY, int graphic, int sync_frame) +{ + struct GraphicInfo_SP g; + + if (NoDisplayFlag) + return; + + getGraphicSource_SP(&g, graphic, sync_frame, -1, -1); + +#if 0 + printf("::: BltImg: %d, %d, %d, %d\n", pX, pY, g.src_x, g.src_y); +#endif + + Blt(pX, pY, g.bitmap, g.src_x, g.src_y); } // Public Function GetStretchCopy(Stretch!) As DDSpriteBuffer