From 3b4f77b0120ef7693ed57c08b7173c1a36e1d8c2 Mon Sep 17 00:00:00 2001 From: Overhaul Date: Wed, 25 Jul 2007 09:24:27 +0000 Subject: [PATCH] Fix problems with missing tile effect in places such as Alma and Tixa underground Also fixes potential problem with buffer overruns git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1115 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Standard Gaming Platform/video.cpp | 40 ++++++++++++++++-------------- TileEngine/renderworld.cpp | 26 +++++++++++++------ TileEngine/worldman.h | 2 +- gamescreen.cpp | 7 +++++- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/Standard Gaming Platform/video.cpp b/Standard Gaming Platform/video.cpp index 65c0e4bb..a1479124 100644 --- a/Standard Gaming Platform/video.cpp +++ b/Standard Gaming Platform/video.cpp @@ -1041,10 +1041,12 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr INT32 cnt; INT16 sShiftX, sShiftY; INT32 uiCountY; + UINT32 uiDestPitchBYTES; GetCurrentVideoSettings( &usWidth, &usHeight, &ubBitDepth ); usHeight=(gsVIEWPORT_WINDOW_END_Y - gsVIEWPORT_WINDOW_START_Y ); + uiDestPitchBYTES = (usWidth * ubBitDepth) / 8; // pSource = gpFrameBuffer; // pDest = gpFrameBuffer; @@ -1093,10 +1095,10 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // memset z-buffer for(uiCountY = gsVIEWPORT_WINDOW_START_Y; uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, sScrollXIncrement*2); - } + } StripRegions[ 0 ].right =(INT16)(gsVIEWPORT_START_X+sScrollXIncrement); usMouseXPos += sScrollXIncrement; @@ -1134,7 +1136,7 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // memset z-buffer for(uiCountY= gsVIEWPORT_WINDOW_START_Y; uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280) + ( ( gsVIEWPORT_END_X - sScrollXIncrement ) * 2 ), 0, + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES) + ( ( gsVIEWPORT_END_X - sScrollXIncrement ) * 2 ), 0, sScrollXIncrement*2); } @@ -1176,8 +1178,8 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr for(uiCountY=sScrollYIncrement-1+gsVIEWPORT_WINDOW_START_Y; uiCountY >= gsVIEWPORT_WINDOW_START_Y; uiCountY--) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, - 2280); + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, + uiDestPitchBYTES); } //for(uiCountY=usHeight-1; uiCountY >= sScrollYIncrement; uiCountY--) @@ -1217,8 +1219,8 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // Zero out z for(uiCountY=(gsVIEWPORT_WINDOW_END_Y - sScrollYIncrement ); uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, - 2280); + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, + uiDestPitchBYTES); } //for(uiCountY=0; uiCountY < (usHeight-sScrollYIncrement); uiCountY++) @@ -1259,14 +1261,14 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // memset z-buffer for(uiCountY=gsVIEWPORT_WINDOW_START_Y; uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, sScrollXIncrement*2); } for(uiCountY=gsVIEWPORT_WINDOW_START_Y + sScrollYIncrement-1; uiCountY >= gsVIEWPORT_WINDOW_START_Y; uiCountY--) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, - 2280); + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, + uiDestPitchBYTES); } @@ -1304,13 +1306,13 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // memset z-buffer for(uiCountY=gsVIEWPORT_WINDOW_START_Y; uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280) + ( ( gsVIEWPORT_END_X - sScrollXIncrement ) * 2 ), 0, + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES) + ( ( gsVIEWPORT_END_X - sScrollXIncrement ) * 2 ), 0, sScrollXIncrement*2); } for(uiCountY=gsVIEWPORT_WINDOW_START_Y + sScrollYIncrement-1; uiCountY >= gsVIEWPORT_WINDOW_START_Y; uiCountY--) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, - 2280); + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, + uiDestPitchBYTES); } @@ -1348,14 +1350,14 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // memset z-buffer for(uiCountY=gsVIEWPORT_WINDOW_START_Y; uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, sScrollXIncrement*2); } for(uiCountY=(gsVIEWPORT_WINDOW_END_Y - sScrollYIncrement); uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, - 2280); + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, + uiDestPitchBYTES); } @@ -1395,13 +1397,13 @@ void ScrollJA2Background(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScr // memset z-buffer for(uiCountY=gsVIEWPORT_WINDOW_START_Y; uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280) + ( ( gsVIEWPORT_END_X - sScrollXIncrement ) * 2 ), 0, + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES) + ( ( gsVIEWPORT_END_X - sScrollXIncrement ) * 2 ), 0, sScrollXIncrement*2); } for(uiCountY=(gsVIEWPORT_WINDOW_END_Y - sScrollYIncrement); uiCountY < gsVIEWPORT_WINDOW_END_Y; uiCountY++) { - memset((UINT8 *)gpZBuffer+(uiCountY*2280), 0, - 2280); + memset((UINT8 *)gpZBuffer+(uiCountY*uiDestPitchBYTES), 0, + uiDestPitchBYTES); } diff --git a/TileEngine/renderworld.cpp b/TileEngine/renderworld.cpp index 3f115e3f..bfc3ab79 100644 --- a/TileEngine/renderworld.cpp +++ b/TileEngine/renderworld.cpp @@ -957,7 +957,7 @@ void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT //if ( 0 ) if ( uiTileIndex < GRIDSIZE ) { - // OK, we're sreaching through this loop anyway, might as well check for mouse position + // OK, we're searching through this loop anyway, might as well check for mouse position // over objects... // Experimental! if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE ) @@ -2892,11 +2892,16 @@ void RenderStaticWorldRect(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom, { UINT32 uiLevelFlags[10]; UINT16 sLevelIDs[10]; + UINT32 uiDestPitchBYTES; + UINT8 *pDestBuf=NULL; // Calculate render starting parameters CalcRenderParameters( sLeft, sTop, sRight, sBottom ); - memset(gpZBuffer, LAND_Z_LEVEL, 2280 * gsVIEWPORT_END_Y ); + pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); + Assert( pDestBuf); + memset(gpZBuffer, LAND_Z_LEVEL, uiDestPitchBYTES * gsVIEWPORT_END_Y ); + UnLockVideoSurface( FRAME_BUFFER); // Reset layer optimizations @@ -2992,12 +2997,17 @@ void RenderStaticWorld( ) { UINT32 uiLevelFlags[9]; UINT16 sLevelIDs[9]; + UINT32 uiDestPitchBYTES; + UINT8 *pDestBuf=NULL; // Calculate render starting parameters CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y ); // Clear z-buffer - memset(gpZBuffer, LAND_Z_LEVEL, 2280 * gsVIEWPORT_END_Y ); + pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); + Assert( pDestBuf); + memset(gpZBuffer, LAND_Z_LEVEL, uiDestPitchBYTES * gsVIEWPORT_END_Y ); + UnLockVideoSurface( FRAME_BUFFER); FreeBackgroundRectType(BGND_FLAG_ANIMATED); InvalidateBackgroundRects(); @@ -6876,7 +6886,7 @@ void ExamineZBufferForHiddenTiles( INT16 sStartPointX_M, INT16 sStartPointY_M, I pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); - // Get VObject for firt land peice! + // Get VObject for first land peice! TileElem = &(gTileDatabase[ FIRSTTEXTURE1 ] ); @@ -6934,7 +6944,7 @@ void ExamineZBufferForHiddenTiles( INT16 sStartPointX_M, INT16 sStartPointY_M, I // Don't let this happen for roads! pObject = gpWorldLevelData[usTileIndex ].pObjectHead; - if ( IsTileRedundent( gpZBuffer, sZLevel, TileElem->hTileSurface, sX, sY, TileElem->usRegionIndex ) ) + if ( IsTileRedundent( uiDestPitchBYTES, gpZBuffer, sZLevel, TileElem->hTileSurface, sX, sY, TileElem->usRegionIndex ) ) { // Mark in the world! gpWorldLevelData[ usTileIndex ].uiFlags |= MAPELEMENT_REDUNDENT; @@ -7351,7 +7361,7 @@ BlitDone: -BOOLEAN IsTileRedundent( UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex ) +BOOLEAN IsTileRedundent( UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex ) { UINT16 *p16BPPPalette; UINT32 uiOffset; @@ -7382,9 +7392,9 @@ BOOLEAN IsTileRedundent( UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset; - ZPtr = (UINT8 *)pZBuffer + (2280*iTempY) + (iTempX*2); + ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2); p16BPPPalette = hSrcVObject->pShadeCurrent; - LineSkip=(2280-(usWidth*2)); + LineSkip=(uiDestPitchBYTES-(usWidth*2)); __asm { diff --git a/TileEngine/worldman.h b/TileEngine/worldman.h index a343253f..c190ce12 100644 --- a/TileEngine/worldman.h +++ b/TileEngine/worldman.h @@ -144,7 +144,7 @@ void WorldHideTrees( ); void WorldShowTrees( ); -BOOLEAN IsTileRedundent( UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex ); +BOOLEAN IsTileRedundent( UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex ); //this is found in editscreen.c //Andrew, you had worldman.c checked out at the time, so I stuck it here. diff --git a/gamescreen.cpp b/gamescreen.cpp index d425a628..623c90a1 100644 --- a/gamescreen.cpp +++ b/gamescreen.cpp @@ -153,11 +153,16 @@ extern void InternalLocateGridNo( UINT16 sGridNo, BOOLEAN fForce ); UINT32 MainGameScreenInit(void) { VIDEO_OVERLAY_DESC VideoOverlayDesc; + UINT32 uiDestPitchBYTES; + UINT8 *pDestBuf=NULL; /* If any 1 have time please calculate how big this buffer should be * any questions? joker */ - gpZBuffer=InitZBuffer( 2048, SCREEN_HEIGHT); + pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES ); + gpZBuffer=InitZBuffer( uiDestPitchBYTES, SCREEN_HEIGHT); + UnLockVideoSurface( FRAME_BUFFER); + InitializeBackgroundRects(); //EnvSetTimeInHours(ENV_TIME_12);