Fix ticket #73, buffer overruns in radar code making CAM_2A unplayable. Reported by Buginator.
There is still some issues with the radar code when scroll limits are being used, but it should now at least be playable again. git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@6065 4a71c877-e1ca-e34f-864e-861f7616d084master
parent
2cea275cb5
commit
b551fb842b
43
src/radar.c
43
src/radar.c
|
@ -85,8 +85,8 @@ static SDWORD radarWidth, radarHeight, radarX, radarY, radarTexWidth, radarTexHe
|
||||||
static float RadarZoom;
|
static float RadarZoom;
|
||||||
static UDWORD radarBufferSize = 0;
|
static UDWORD radarBufferSize = 0;
|
||||||
|
|
||||||
static void DrawRadarTiles(UDWORD *screen);
|
static void DrawRadarTiles(void);
|
||||||
static void DrawRadarObjects(UDWORD *screen);
|
static void DrawRadarObjects(void);
|
||||||
static void DrawRadarExtras(float pixSizeH, float pixSizeV);
|
static void DrawRadarExtras(float pixSizeH, float pixSizeV);
|
||||||
|
|
||||||
static void radarSize(float zoom)
|
static void radarSize(float zoom)
|
||||||
|
@ -199,8 +199,8 @@ void CalcRadarPosition(int mX, int mY, int *PosX, int *PosY)
|
||||||
CalcRadarPixelSize(&pixSizeH, &pixSizeV);
|
CalcRadarPixelSize(&pixSizeH, &pixSizeV);
|
||||||
sPosX = (float)posX / pixSizeH; // adjust for pixel size
|
sPosX = (float)posX / pixSizeH; // adjust for pixel size
|
||||||
sPosY = (float)posY / pixSizeV;
|
sPosY = (float)posY / pixSizeV;
|
||||||
sPosX -= scrollMinX; // adjust for scroll limits
|
sPosX += scrollMinX; // adjust for scroll limits
|
||||||
sPosY -= scrollMinY;
|
sPosY += scrollMinY;
|
||||||
|
|
||||||
#if REALLY_DEBUG_RADAR
|
#if REALLY_DEBUG_RADAR
|
||||||
debug(LOG_ERROR, "m=(%d,%d) radar=(%d,%d) pos(%d,%d), scroll=(%u-%u,%u-%u) sPos=(%d,%d), pixSize=(%f,%f)",
|
debug(LOG_ERROR, "m=(%d,%d) radar=(%d,%d) pos(%d,%d), scroll=(%u-%u,%u-%u) sPos=(%d,%d), pixSize=(%f,%f)",
|
||||||
|
@ -247,8 +247,8 @@ void drawRadar(void)
|
||||||
|
|
||||||
if (frameSkip <= 0)
|
if (frameSkip <= 0)
|
||||||
{
|
{
|
||||||
DrawRadarTiles(radarBuffer);
|
DrawRadarTiles();
|
||||||
DrawRadarObjects(radarBuffer);
|
DrawRadarObjects();
|
||||||
pie_DownLoadRadar(radarBuffer, radarTexWidth, radarTexHeight);
|
pie_DownLoadRadar(radarBuffer, radarTexWidth, radarTexHeight);
|
||||||
frameSkip = RADAR_FRAME_SKIP;
|
frameSkip = RADAR_FRAME_SKIP;
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ static PIELIGHT appliedRadarColour(RADAR_DRAW_MODE radarDrawMode, MAPTILE *WTile
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Draw the map tiles on the radar. */
|
/** Draw the map tiles on the radar. */
|
||||||
static void DrawRadarTiles(UDWORD *screen)
|
static void DrawRadarTiles(void)
|
||||||
{
|
{
|
||||||
SDWORD x, y;
|
SDWORD x, y;
|
||||||
|
|
||||||
|
@ -319,21 +319,22 @@ static void DrawRadarTiles(UDWORD *screen)
|
||||||
{
|
{
|
||||||
for (y = scrollMinY; y < scrollMaxY; y++)
|
for (y = scrollMinY; y < scrollMaxY; y++)
|
||||||
{
|
{
|
||||||
UDWORD *pScr = screen + radarTexWidth * y + x;
|
|
||||||
MAPTILE *psTile = mapTile(x, y);
|
MAPTILE *psTile = mapTile(x, y);
|
||||||
|
size_t pos = radarTexWidth * (y - scrollMinY) + (x - scrollMinX);
|
||||||
|
|
||||||
|
ASSERT(pos * sizeof(*radarBuffer) < radarBufferSize, "Buffer overrun");
|
||||||
if (!getRevealStatus() || TEST_TILE_VISIBLE(selectedPlayer, psTile) || godMode)
|
if (!getRevealStatus() || TEST_TILE_VISIBLE(selectedPlayer, psTile) || godMode)
|
||||||
{
|
{
|
||||||
*pScr = appliedRadarColour(radarDrawMode, psTile).rgba;
|
radarBuffer[pos] = appliedRadarColour(radarDrawMode, psTile).rgba;
|
||||||
} else {
|
} else {
|
||||||
*pScr = WZCOL_RADAR_BACKGROUND.rgba;
|
radarBuffer[pos] = WZCOL_RADAR_BACKGROUND.rgba;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Draw the droids and structure positions on the radar. */
|
/** Draw the droids and structure positions on the radar. */
|
||||||
static void DrawRadarObjects(UDWORD *screen)
|
static void DrawRadarObjects(void)
|
||||||
{
|
{
|
||||||
UBYTE clan;
|
UBYTE clan;
|
||||||
PIELIGHT playerCol;
|
PIELIGHT playerCol;
|
||||||
|
@ -380,15 +381,16 @@ static void DrawRadarObjects(UDWORD *screen)
|
||||||
{
|
{
|
||||||
int x = psDroid->pos.x / TILE_UNITS;
|
int x = psDroid->pos.x / TILE_UNITS;
|
||||||
int y = psDroid->pos.y / TILE_UNITS;
|
int y = psDroid->pos.y / TILE_UNITS;
|
||||||
UDWORD *Ptr = screen + x + y * radarTexWidth;
|
size_t pos = (x - scrollMinX) + (y - scrollMinY) * radarTexWidth;
|
||||||
|
|
||||||
|
ASSERT(pos * sizeof(*radarBuffer) < radarBufferSize, "Buffer overrun");
|
||||||
if (clan == selectedPlayer && gameTime-psDroid->timeLastHit < HIT_NOTIFICATION)
|
if (clan == selectedPlayer && gameTime-psDroid->timeLastHit < HIT_NOTIFICATION)
|
||||||
{
|
{
|
||||||
*Ptr = flashCol.rgba;
|
radarBuffer[pos] = flashCol.rgba;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*Ptr = playerCol.rgba;
|
radarBuffer[pos] = playerCol.rgba;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -399,10 +401,11 @@ static void DrawRadarObjects(UDWORD *screen)
|
||||||
{
|
{
|
||||||
for (y = scrollMinY; y < scrollMaxY; y++)
|
for (y = scrollMinY; y < scrollMaxY; y++)
|
||||||
{
|
{
|
||||||
UDWORD *pScr = screen + y * radarTexWidth + x;
|
|
||||||
MAPTILE *psTile = mapTile(x, y);
|
MAPTILE *psTile = mapTile(x, y);
|
||||||
STRUCTURE *psStruct = (STRUCTURE *)psTile->psObject;
|
STRUCTURE *psStruct = (STRUCTURE *)psTile->psObject;
|
||||||
|
size_t pos = (x - scrollMinX) + (y - scrollMinY) * radarTexWidth;
|
||||||
|
|
||||||
|
ASSERT(pos * sizeof(*radarBuffer) < radarBufferSize, "Buffer overrun");
|
||||||
if (!TileHasStructure(psTile))
|
if (!TileHasStructure(psTile))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
@ -435,11 +438,11 @@ static void DrawRadarObjects(UDWORD *screen)
|
||||||
{
|
{
|
||||||
if (clan == selectedPlayer && gameTime - psStruct->timeLastHit < HIT_NOTIFICATION)
|
if (clan == selectedPlayer && gameTime - psStruct->timeLastHit < HIT_NOTIFICATION)
|
||||||
{
|
{
|
||||||
*pScr = flashCol.rgba;
|
radarBuffer[pos] = flashCol.rgba;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*pScr = playerCol.rgba;
|
radarBuffer[pos] = playerCol.rgba;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -501,7 +504,7 @@ static SDWORD getLengthAdjust( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Draws a Myth/FF7 style viewing window */
|
/** Draws a Myth/FF7 style viewing window */
|
||||||
static void drawViewingWindow(UDWORD x, UDWORD y, float pixSizeH, float pixSizeV)
|
static void drawViewingWindow(int x, int y, float pixSizeH, float pixSizeV)
|
||||||
{
|
{
|
||||||
Vector3i v[4], tv[4], centre;
|
Vector3i v[4], tv[4], centre;
|
||||||
int shortX, longX, yDrop, yDropVar;
|
int shortX, longX, yDrop, yDropVar;
|
||||||
|
@ -526,8 +529,8 @@ static void drawViewingWindow(UDWORD x, UDWORD y, float pixSizeH, float pixSizeV
|
||||||
v[3].x = -shortX;
|
v[3].x = -shortX;
|
||||||
v[3].y = yDrop;
|
v[3].y = yDrop;
|
||||||
|
|
||||||
centre.x = radarX + x + (visibleTiles.x * pixSizeH) / 2;
|
centre.x = radarX + (x - scrollMinX) + ((visibleTiles.x - scrollMinX) * pixSizeH) / 2;
|
||||||
centre.y = radarY + y + (visibleTiles.y * pixSizeV) / 2;
|
centre.y = radarY + (y - scrollMinY) + ((visibleTiles.y - scrollMinY) * pixSizeV) / 2;
|
||||||
|
|
||||||
RotateVector2D(v,tv,¢re,player.r.y,4);
|
RotateVector2D(v,tv,¢re,player.r.y,4);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue