}
// --- 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;
static void Blt(int pX, int pY, int SpriteX, int SpriteY)
{
RECT DR, SR;
+#if 0
long Tmp;
+#endif
+
+#if 1
+
+ int sx1 = mScrollX_last - 2 * TILEX;
+ int sy1 = mScrollY_last - 2 * TILEY;
+ int sx2 = mScrollX_last + SXSIZE + 1 * TILEX;
+ int sy2 = mScrollY_last + 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;
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
}
+#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;
+ DR.right = pX + mSpriteWidth + mDestXOff;
+ DR.bottom = pY + mSpriteHeight + mDestYOff;
+ }
+ {
+ SR.left = mSpriteWidth * (SpriteX - 1);
+ SR.top = mSpriteHeight * (SpriteY - 1);
+ 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
+
void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos)
{
int XPos, YPos;
XPos = (SpritePos % mXSpriteCount) + 1;
YPos = (SpritePos / mXSpriteCount) + 1;
+
+#if 0
+ if (TEST_flag)
+ printf("::: DDSpriteBuffer_BltEx(): %d, %d [%d]\n",
+ pX, pY, SpritePos);
+#endif
+
Blt(pX, pY, XPos, YPos);
}