X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2FDDSpriteBuffer.c;h=8f524c0228b261d86a8d00010d2c53d0a1ea1d87;hb=1d3eff06cde10309320341fa92abec5b14f1c6f6;hp=3fee72480cca2c00c6da79f9ec654fa645c26f30;hpb=ac592f78bbedc4808c5e35fb22bc8fc9f0398c8d;p=rocksndiamonds.git diff --git a/src/game_sp/DDSpriteBuffer.c b/src/game_sp/DDSpriteBuffer.c index 3fee7248..8f524c02 100644 --- a/src/game_sp/DDSpriteBuffer.c +++ b/src/game_sp/DDSpriteBuffer.c @@ -4,252 +4,78 @@ #include "DDSpriteBuffer.h" -static void Blt(int pX, int pY, int SpriteX, int SpriteY); -// --- VERSION 1.0 CLASS -// --- BEGIN -// --- MultiUse = -1 'True // True -// --- Persistable = 0 'NotPersistable // NotPersistable -// --- DataBindingBehavior = 0 'vbNone // vbNone -// --- DataSourceBehavior = 0 'vbNone // vbNone -// --- MTSTransactionMode = 0 'NotAnMTSObject // NotAnMTSObject -// --- END - -// static char *VB_Name = "DDSpriteBuffer"; -// static boolean VB_GlobalNameSpace = False; -// static boolean VB_Creatable = True; -// static boolean VB_PredeclaredId = False; -// static boolean VB_Exposed = False; -// --- Option Explicit - -// needs reference to: DirectX7 for Visual Basic Type Library - -DirectDrawSurface7 Buffer; -DirectDrawSurface7 mDest; -long mXSpriteCount, mYSpriteCount; -long mSpriteWidth, mSpriteHeight; -long mDestXOff, mDestYOff; - -void DDSpriteBuffer_Let_DestXOff(long NewVal) -{ - mDestXOff = NewVal; -} - -long DDSpriteBuffer_Get_DestXOff() -{ - long DestXOff; - - DestXOff = mDestXOff; - - return DestXOff; -} - -void DDSpriteBuffer_Let_DestYOff(long NewVal) -{ - mDestYOff = NewVal; -} - -long DDSpriteBuffer_Get_DestYOff() -{ - long DestYOff; - - DestYOff = mDestYOff; - - return DestYOff; -} - -int DDSpriteBuffer_Set_DestinationSurface(DirectDrawSurface7 DSurface) -{ - int DestinationSurface; - - mDest = DSurface; - - return DestinationSurface; -} - -DirectDrawSurface7 DDSpriteBuffer_Get_Surface() +static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY) { - DirectDrawSurface7 Surface; - - Surface = Buffer; - - return Surface; -} - -long DDSpriteBuffer_Get_Width() -{ - long Width; - - Width = mSpriteWidth * mXSpriteCount; - - return Width; -} - -int DDSpriteBuffer_Get_Height() -{ - int Height; - - Height = mSpriteHeight * mYSpriteCount; - - return Height; -} - -boolean DDSpriteBuffer_CreateFromFile(char *Path, long xSprites, long ySprites) -{ - boolean CreateFromFile; - - DDSURFACEDESC2 SD; - - { - SD.lFlags = DDSD_CAPS; // Or DDSD_WIDTH Or DDSD_HEIGHT - SD.ddsCaps.lCaps = DDSCAPS_VIDEOMEMORY; // DDSCAPS_SYSTEMMEMORY 'DDSCAPS_OFFSCREENPLAIN - } - - // --- On Error GoTo CreateFromFileEH -#if 1 - SD.LWidth = 16 * TILEX; - SD.LHeight = 16 * TILEY; -#else - Buffer = DDraw.CreateSurfaceFromFile(Path, SD); +#if NEW_TILESIZE + int pseudo_sxsize = SXSIZE * TILESIZE / TILESIZE_VAR; + int pseudo_sysize = SYSIZE * TILESIZE / TILESIZE_VAR; #endif - // --- On Error GoTo 0 - -#if 0 - Buffer.GetSurfaceDesc(SD); + 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; +#if NEW_TILESIZE + int sx2 = scx + pseudo_sxsize + 1 * TILEX; + int sy2 = scy + pseudo_sysize + 1 * TILEY; +#else + int sx2 = scx + SXSIZE + 1 * TILEX; + int sy2 = scy + SYSIZE + 1 * TILEY; #endif + int sx = pX - sx1; + int sy = pY - sy1; + int tile_x = sx / TILESIZE; + int tile_y = sy / TILESIZE; + int move_x = (sx + TILESIZE - 1) / TILESIZE; + int move_y = (sy + TILESIZE - 1) / TILESIZE; - mSpriteWidth = SD.LWidth / xSprites; - mSpriteHeight = SD.LHeight / ySprites; - mXSpriteCount = xSprites; - mYSpriteCount = ySprites; - - CreateFromFile = True; - return CreateFromFile; - - // CreateFromFileEH: - CreateFromFile = False; - - return CreateFromFile; -} - -boolean DDSpriteBuffer_CreateAtSize(long Width, long Height, long xSprites, long ySprites) -{ - boolean CreateAtSize; - - DDSURFACEDESC2 SD; - - { - SD.lFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - SD.ddsCaps.lCaps = DDSCAPS_VIDEOMEMORY; - // SD.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN - SD.LWidth = Width; - SD.LHeight = Height; - } - - // --- On Error GoTo CreateAtSizeEH - Buffer = DDraw.CreateSurface(SD); - // --- On Error GoTo 0 - - mSpriteWidth = Width / xSprites; - mSpriteHeight = Height / ySprites; - mXSpriteCount = xSprites; - mYSpriteCount = ySprites; - CreateAtSize = True; - return CreateAtSize; + if (NoDisplayFlag) + return; - // CreateAtSizeEH: - CreateAtSize = False; + /* do not draw fields that are outside the visible screen area */ + if (pX < sx1 || pX > sx2 || pY < sy1 || pY > sy2) + return; - return CreateAtSize; -} +#if NEW_TILESIZE -void DDSpriteBuffer_Cls(int BackColor) -{ - RECT EmptyRect; +#if 0 + SpriteX = SpriteX * TILESIZE_VAR / TILESIZE; + SpriteY = SpriteY * TILESIZE_VAR / TILESIZE; +#endif - Buffer.BltColorFill(EmptyRect, BackColor); -} + sx = sx * TILESIZE_VAR / TILESIZE; + sy = sy * TILESIZE_VAR / TILESIZE; -static void Blt(int pX, int pY, int SpriteX, int SpriteY) -{ - RECT DR, SR; -#if 0 - long Tmp; + BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY, + TILEX_VAR, TILEY_VAR, sx, sy); +#else + BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY, + TILEX, TILEY, sx, sy); #endif - if (NoDisplayFlag) - return; + redraw[tile_x][tile_y] = TRUE; + redraw_tiles++; + if (move_x != tile_x) { - DR.left = pX + mDestXOff; - DR.top = pY + mDestYOff; - DR.right = pX + mSpriteWidth + mDestXOff; - DR.bottom = pY + mSpriteHeight + mDestYOff; + redraw[move_x][tile_y] = TRUE; + redraw_tiles++; } + else if (move_y != tile_y) { - SR.left = mSpriteWidth * (SpriteX - 1); - SR.top = mSpriteHeight * (SpriteY - 1); - SR.right = SR.left + mSpriteWidth; - SR.bottom = SR.top + mSpriteHeight; + redraw[tile_x][move_y] = TRUE; + redraw_tiles++; } - -#if 1 - BlitBitmap(sp_objects, screenBitmap, - SR.left, SR.top, - mSpriteWidth, mSpriteHeight, - DR.left, DR.top); -#else - Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT); -#endif } -void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos) +void DDSpriteBuffer_BltImg(int pX, int pY, int graphic, int sync_frame) { - int XPos, YPos; + struct GraphicInfo_SP g; if (NoDisplayFlag) return; - XPos = (SpritePos % mXSpriteCount) + 1; - YPos = (SpritePos / mXSpriteCount) + 1; - Blt(pX, pY, XPos, YPos); -} - -// Public Function GetStretchCopy(Stretch!) As DDSpriteBuffer -// Dim SR As RECT, DR As RECT, Y%, X%, pX%, pY%, Tmp& -// // Set GetStretchCopy = New DDSpriteBuffer // (handle this later, if needed) -// If Not GetStretchCopy.CreateAtSize(Stretch * Width, Stretch * Height, mXSpriteCount, mYSpriteCount) Then -// Set GetStretchCopy = Nothing -// Else -// For Y = 0 To mYSpriteCount - 1 -// pY = Y * Stretch * mSpriteHeight -// For X = 0 To mXSpriteCount - 1 -// pX = X * Stretch * mSpriteWidth -// With DR -// .left = pX -// .top = pY -// .right = pX + mSpriteWidth * Stretch -// .bottom = pY + mSpriteHeight * Stretch -// End With -// With SR -// .left = mSpriteWidth * X -// .top = mSpriteHeight * Y -// .right = .left + mSpriteWidth -// .bottom = .top + mSpriteHeight -// End With -// Tmp = GetStretchCopy.Surface.Blt(DR, Buffer, SR, DDBLT_WAIT) -// Next X -// Next Y -// 'GetStretchCopy.Surface.Blt DR, Buffer, DR, DDBLT_WAIT -// End If -// End Function + getGraphicSource_SP(&g, graphic, sync_frame, -1, -1); -#if 0 - -static void Class_Initialize() -{ - mDestXOff = 0; - mDestYOff = 0; + Blt(pX, pY, g.bitmap, g.src_x, g.src_y); } - -#endif