Reworked the DrawMap function. Flattens the large switch in it, removes the need for a few if checks that were done in every iteration of the old switch case loop and also shades all the map sectors using only one call to Lock- and UnlockVideoSurface instead of continuously locking and unlocking the surfaces when shading every single map element. (by Asdow)

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8885 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2020-08-15 12:55:33 +00:00
parent 5eaec6881e
commit 6e87488da6
+445 -283
View File
@@ -526,6 +526,7 @@ void ShowTownText( void );
void DrawTownLabels(STR16 pString, STR16 pStringA,UINT16 usFirstX, UINT16 usFirstY); void DrawTownLabels(STR16 pString, STR16 pStringA,UINT16 usFirstX, UINT16 usFirstY);
void ShowTeamAndVehicles(INT32 fShowFlags); void ShowTeamAndVehicles(INT32 fShowFlags);
BOOLEAN ShadeMapElem( INT16 sMapX, INT16 sMapY, INT32 iColor ); BOOLEAN ShadeMapElem( INT16 sMapX, INT16 sMapY, INT32 iColor );
BOOLEAN ShadeMapElements(const INT32(&colorMap)[16][16]);
void AdjustXForLeftMapEdge(STR16 wString, INT16 *psX, INT32 iFont); void AdjustXForLeftMapEdge(STR16 wString, INT16 *psX, INT32 iFont);
void BlitTownGridMarkers( void ); void BlitTownGridMarkers( void );
void BlitMineGridMarkers( void ); void BlitMineGridMarkers( void );
@@ -709,382 +710,414 @@ void HandleShowingOfEnemiesWithMilitiaOn( void )
} }
} }
// colour for a sector on the map
// aType = 0: disease INT32 GetMapColourForWeather(const INT16 sX, const INT16 sY) noexcept
// aType = 1: weather
// aType = 2: intel
INT32 GetMapColour( INT16 sX, INT16 sY, UINT8 aType )
{ {
UINT8 sector = SECTOR( sX, sY ); const INT32 weatherColors[]{
MAP_SHADE_BLACK,
MAP_SHADE_LT_CYAN,
MAP_SHADE_LT_BLUE,
MAP_SHADE_ORANGE,
MAP_SHADE_LT_GREY
};
if ( aType == 0 ) const auto sector = SECTOR(sX, sY);
{ const SECTORINFO *const pSectorInfo = &(SectorInfo[sector]);
SECTORINFO *pSectorInfo = &( SectorInfo[sector] ); const auto weather = pSectorInfo->usWeather;
// display sector information only if we know about infection there return weatherColors[weather];
if ( pSectorInfo && ( ( pSectorInfo->usInfectionFlag & SECTORDISEASE_DIAGNOSED_PLAYER ) || gubFact[FACT_DISEASE_WHODATA_ACCESS] ) ) }
void FillMapColoursForWeather(INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ]) noexcept
{
for (UINT8 sY = 0; sY < MAXIMUM_VALID_Y_COORDINATE; ++sY)
{
for (UINT8 sX = 0; sX < MAXIMUM_VALID_X_COORDINATE; ++sX)
{ {
FLOAT diseaseratio = pSectorInfo->fDiseasePoints / DISEASE_MAX_SECTOR; const auto xCoord = sX + MINIMUM_VALID_X_COORDINATE;
const auto yCoord = sY + MINIMUM_VALID_Y_COORDINATE;
if ( pSectorInfo->fDiseasePoints < 0.1f ) colorMap[sY][sX] = GetMapColourForWeather(xCoord, yCoord);
return MAP_SHADE_BLACK;
else if ( diseaseratio < 0.05f )
return MAP_SHADE_DK_GREEN;
else if ( diseaseratio < 0.1f )
return MAP_SHADE_MD_GREEN;
else if ( diseaseratio < 0.25f )
return MAP_SHADE_LT_GREEN;
else if ( diseaseratio < 0.4f )
return MAP_SHADE_MD_YELLOW;
else if ( diseaseratio < 0.65f )
return MAP_SHADE_ORANGE;
else if ( diseaseratio < 0.8f )
return MAP_SHADE_DK_RED;
else if ( diseaseratio < 0.9f )
return MAP_SHADE_MD_RED;
else
return MAP_SHADE_LT_RED;
} }
} }
else if ( aType == 1 ) }
{
SECTORINFO *pSectorInfo = &( SectorInfo[sector] );
// display sector information only if we know about infection there
if ( pSectorInfo ) void FillMapColoursForIntel(INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ]) noexcept
{
for (UINT8 sY = 0; sY < MAXIMUM_VALID_Y_COORDINATE; ++sY)
{
for (UINT8 sX = 0; sX < MAXIMUM_VALID_X_COORDINATE; ++sX)
{ {
switch ( pSectorInfo->usWeather ) const auto xCoord = sX + MINIMUM_VALID_X_COORDINATE;
const auto yCoord = sY + MINIMUM_VALID_Y_COORDINATE;
const auto sector = SECTOR(xCoord, yCoord);
colorMap[sY][sX] = gMapIntelData[sector].mapcolour;
}
}
}
INT32 GetMapColourForDisease(const INT16 sX, const INT16 sY) noexcept
{
const UINT8 sector = SECTOR(sX, sY);
const SECTORINFO *const pSectorInfo = &(SectorInfo[sector]);
// display sector information only if we know about infection there
if (pSectorInfo && ((pSectorInfo->usInfectionFlag & SECTORDISEASE_DIAGNOSED_PLAYER) || gubFact[FACT_DISEASE_WHODATA_ACCESS]))
{
const FLOAT diseaseratio = pSectorInfo->fDiseasePoints / DISEASE_MAX_SECTOR;
if (pSectorInfo->fDiseasePoints < 0.1f)
return MAP_SHADE_BLACK;
else if (diseaseratio < 0.05f)
return MAP_SHADE_DK_GREEN;
else if (diseaseratio < 0.1f)
return MAP_SHADE_MD_GREEN;
else if (diseaseratio < 0.25f)
return MAP_SHADE_LT_GREEN;
else if (diseaseratio < 0.4f)
return MAP_SHADE_MD_YELLOW;
else if (diseaseratio < 0.65f)
return MAP_SHADE_ORANGE;
else if (diseaseratio < 0.8f)
return MAP_SHADE_DK_RED;
else if (diseaseratio < 0.9f)
return MAP_SHADE_MD_RED;
else
return MAP_SHADE_LT_RED;
}
return MAP_SHADE_BLACK;
}
void FillMapColoursForDisease(INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ]) noexcept
{
for (UINT8 sY = 0; sY < MAXIMUM_VALID_Y_COORDINATE; ++sY)
{
for (UINT8 sX = 0; sX < MAXIMUM_VALID_X_COORDINATE; ++sX)
{
const auto xCoord = sX + MINIMUM_VALID_X_COORDINATE;
const auto yCoord = sY + MINIMUM_VALID_Y_COORDINATE;
colorMap[sY][sX] = GetMapColourForDisease(xCoord, yCoord);
}
}
}
void fillMapColoursForVisitedSectors(INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ])
{
auto sectorColor = MAP_SHADE_BLACK;
if (gGameSettings.fOptions[TOPTION_ALT_MAP_COLOR])
{
// HEADROCK HAM 4: An alternate display for the map in normal mode. Unexplored sectors
// are in grey, similar to a recon map. Others are left in normal vivid color.
sectorColor = MAP_SHADE_DK_GREY;
}
for (UINT8 sY = 0; sY < MAXIMUM_VALID_Y_COORDINATE; ++sY)
{
for (UINT8 sX = 0; sX < MAXIMUM_VALID_X_COORDINATE; ++sX)
{
const auto xCoord = sX + MINIMUM_VALID_X_COORDINATE;
const auto yCoord = sY + MINIMUM_VALID_Y_COORDINATE;
// not visited
if (GetSectorFlagStatus(xCoord, yCoord, (UINT8)iCurrentMapSectorZ, SF_ALREADY_VISITED) == FALSE)
{ {
case WEATHER_FORECAST_RAIN: colorMap[sY][sX] = sectorColor;
return MAP_SHADE_LT_CYAN; }
break; else
case WEATHER_FORECAST_THUNDERSHOWERS: {
return MAP_SHADE_LT_BLUE; colorMap[sY][sX] = MAP_SHADE_MAX; // Used to mark sectors that will not be shaded
break;
case WEATHER_FORECAST_SANDSTORM:
return MAP_SHADE_ORANGE;
break;
case WEATHER_FORECAST_SNOW:
return MAP_SHADE_LT_GREY;
break;
case WEATHER_FORECAST_NORMAL:
default:
return MAP_SHADE_BLACK;
break;
} }
} }
} }
else if ( aType == 2 )
{
return gMapIntelData[sector].mapcolour;
}
return MAP_SHADE_DK_GREY;
} }
UINT32 DrawMap( void )
void fillMapColoursForAirSpace(INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ])
{ {
HVSURFACE hSrcVSurface; for (UINT8 sY = 0; sY < MAXIMUM_VALID_Y_COORDINATE; ++sY)
UINT32 uiDestPitchBYTES; {
UINT32 uiSrcPitchBYTES; for (UINT8 sX = 0; sX < MAXIMUM_VALID_X_COORDINATE; ++sX)
UINT16 *pDestBuf; {
UINT8 *pSrcBuf; const auto xCoord = sX + MINIMUM_VALID_X_COORDINATE;
INT16 cnt, cnt2; const auto yCoord = sY + MINIMUM_VALID_Y_COORDINATE;
INT32 iCounter = 0;
INT32 iCounter2 = 0;
INT16 sBaseSectorValue = 0;
//MAP_VIEW_START_X = (SCREEN_WIDTH - 370); const BOOLEAN fAlreadyVisited = GetSectorFlagStatus(xCoord, yCoord, (UINT8)iCurrentMapSectorZ, SF_ALREADY_VISITED);
//MAP_VIEW_START_Y = 10;
if (StrategicMap[xCoord + yCoord * WORLD_MAP_X].usAirType & AIRSPACE_PLAYER_ACTIVE)
{
if (StrategicMap[xCoord + yCoord * WORLD_MAP_X].usAirType & AIRSPACE_ENEMY_ACTIVE)
{
// sector not visited and not air controlled
colorMap[sY][sX] = fAlreadyVisited ? MAP_SHADE_LT_YELLOW : MAP_SHADE_DK_YELLOW;
}
else
{
// sector not visited but air controlled
colorMap[sY][sX] = fAlreadyVisited ? MAP_SHADE_LT_GREEN : MAP_SHADE_DK_GREEN;
}
}
else if (StrategicMap[xCoord + yCoord * WORLD_MAP_X].usAirType & AIRSPACE_ENEMY_ACTIVE)
{
// sector not visited and not air controlled
colorMap[sY][sX] = fAlreadyVisited ? MAP_SHADE_LT_RED : MAP_SHADE_DK_RED;
}
else
{
// sector not visited, currently nobody controls the airspace
//colorMap[sY][sX] = fAlreadyVisited ? MAP_SHADE_LT_BLUE : MAP_SHADE_MD_BLUE;
colorMap[sY][sX] = MAP_SHADE_MAX; // Used to mark sectors that will not be shaded
}
}
}
}
void fillMapColoursForSamSiteAirSpace( INT32( &colorMap )[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ] )
{
for (INT16 cnt2 = MINIMUM_VALID_Y_COORDINATE; cnt2 <= MAXIMUM_VALID_Y_COORDINATE; ++cnt2)
{
for (INT16 cnt = MINIMUM_VALID_X_COORDINATE; cnt <= MAXIMUM_VALID_X_COORDINATE; ++cnt)
{
BOOLEAN a = FALSE;
BOOLEAN b = FALSE;
BOOLEAN c = FALSE;
BOOLEAN d = FALSE;
{
for (int i = 0; i < NUMBER_OF_SAMS; ++i)
{
BOOLEAN samworking = FALSE;
if (DoesSamCoverSector( i, SECTOR( cnt, cnt2 ), &samworking ) && samworking)
{
if (i == 0) a = TRUE;
if (i == 1) b = TRUE;
if (i == 2) c = TRUE;
if (i == 3) d = TRUE;
}
}
}
const auto x = cnt - MINIMUM_VALID_X_COORDINATE;
const auto y = cnt2 - MINIMUM_VALID_Y_COORDINATE;
if (a && !b && !c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED;
else if (!a && b && !c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_GREEN;
else if (!a && !b && c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_BLUE;
else if (!a && !b && !c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_YELLOW;
else if (a && b && !c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_GREEN;
else if (a && !b && c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_BLUE;
else if (a && !b && !c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_YELLOW;
else if (!a && b && c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_GREEN_BLUE;
else if (!a && b && !c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_GREEN_YELLOW;
else if (!a && !b && c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_BLUE_YELLOW;
else if (a && b && c && !d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_GREEN_BLUE;
else if (a && b && !c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_GREEN_YELLOW;
else if (a && !b && c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_BLUE_YELLOW;
else if (!a && b && c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_GREEN_BLUE_YELLOW;
else if (a && b && c && d)
colorMap[ y ][ x ] = MAP_SHADE_MIX_RED_GREEN_BLUE_YELLOW;
}
}
}
UINT32 DrawMap(void)
{
MapScreenRect.iLeft = MAP_VIEW_START_X + MAP_GRID_X - 2; MapScreenRect.iLeft = MAP_VIEW_START_X + MAP_GRID_X - 2;
MapScreenRect.iTop = MAP_VIEW_START_Y + MAP_GRID_Y - 1; MapScreenRect.iTop = MAP_VIEW_START_Y + MAP_GRID_Y - 1;
MapScreenRect.iRight = MAP_VIEW_START_X + MAP_VIEW_WIDTH - 1 + MAP_GRID_X; MapScreenRect.iRight = MAP_VIEW_START_X + MAP_VIEW_WIDTH - 1 + MAP_GRID_X;
MapScreenRect.iBottom = MAP_VIEW_START_Y + MAP_VIEW_HEIGHT - 10 + MAP_GRID_Y; MapScreenRect.iBottom = MAP_VIEW_START_Y + MAP_VIEW_HEIGHT - 10 + MAP_GRID_Y;
//MapScreenRect={ (MAP_VIEW_START_X+MAP_GRID_X - 2), ( MAP_VIEW_START_Y+MAP_GRID_Y - 1), MAP_VIEW_START_X + MAP_VIEW_WIDTH - 1 + MAP_GRID_X , MAP_VIEW_START_Y+MAP_VIEW_HEIGHT-10+MAP_GRID_Y}; if (!iCurrentMapSectorZ)
{ // Aboveground sectors
if ( gusMapDisplayColourMode == MAP_DISPLAY_INTEL ) UINT32 uiDestPitchBYTES;
{ UINT16 *pDestBuf = (UINT16*)LockVideoSurface(guiSAVEBUFFER, &uiDestPitchBYTES);
extern void DetermineMapIntelData(INT32 asSectorZ);
// This is the location where we should call lua and refill our intel data HVSURFACE hSrcVSurface;
DetermineMapIntelData( iCurrentMapSectorZ ); CHECKF(GetVideoSurface(&hSrcVSurface, guiBIGMAP));
}
UINT32 uiSrcPitchBYTES;
UINT8 *pSrcBuf = LockVideoSurface(guiBIGMAP, &uiSrcPitchBYTES);
if( !iCurrentMapSectorZ ) Blt8BPPDataTo16BPPBufferHalf(pDestBuf, uiDestPitchBYTES, hSrcVSurface, pSrcBuf, uiSrcPitchBYTES, MAP_VIEW_START_X + 1, MAP_VIEW_START_Y);
{
pDestBuf = (UINT16*)LockVideoSurface( guiSAVEBUFFER, &uiDestPitchBYTES);
CHECKF( GetVideoSurface( &hSrcVSurface, guiBIGMAP) ); UnLockVideoSurface(guiBIGMAP);
pSrcBuf = LockVideoSurface( guiBIGMAP, &uiSrcPitchBYTES); UnLockVideoSurface(guiSAVEBUFFER);
// clip blits to mapscreen region
//ClipBlitsToMapViewRegion( );
Blt8BPPDataTo16BPPBufferHalf( pDestBuf, uiDestPitchBYTES, hSrcVSurface, pSrcBuf, uiSrcPitchBYTES, MAP_VIEW_START_X + 1, MAP_VIEW_START_Y ); // shade map sectors (must be done before icons!)
if (!is_networked) //Don't shade anything if we're in multiplayer game
UnLockVideoSurface( guiBIGMAP ); {
UnLockVideoSurface( guiSAVEBUFFER ); INT32 colorMap[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ]{};
// draw SAM sites switch (gusMapDisplayColourMode)
//ShowSAMSitesOnStrategicMap( );
//UpdateAirspaceControl();
if ( !iCurrentMapSectorZ )
{
// shade map sectors (must be done after Tixa/Orta/Mine icons have been blitted, but before icons!)
for ( cnt = 1; cnt < MAP_WORLD_X - 1; ++cnt )
{ {
for ( cnt2 = 1; cnt2 < MAP_WORLD_Y - 1; ++cnt2 ) case MAP_DISPLAY_AIRSPACE:
{ {
// LATE DESIGN CHANGE: darken sectors not yet visited, instead of those under known enemy control fillMapColoursForAirSpace(colorMap);
if(!is_networked) //hayden - dont darken anything ShadeMapElements(colorMap);
{ }
switch ( gusMapDisplayColourMode ) break;
{
case MAP_DISPLAY_AIRSPACE:
{
BOOLEAN fAlreadyVisited = GetSectorFlagStatus( cnt, cnt2, (UINT8)iCurrentMapSectorZ, SF_ALREADY_VISITED );
if ( StrategicMap[cnt + cnt2 * WORLD_MAP_X].usAirType & AIRSPACE_PLAYER_ACTIVE ) case MAP_DISPLAY_AIRSPACE_COLOURED_SAMS:
{ {
if ( StrategicMap[cnt + cnt2 * WORLD_MAP_X].usAirType & AIRSPACE_ENEMY_ACTIVE ) fillMapColoursForSamSiteAirSpace(colorMap);
{ ShadeMapElements(colorMap);
// sector not visited and not air controlled }
ShadeMapElem( cnt, cnt2, fAlreadyVisited ? MAP_SHADE_LT_YELLOW : MAP_SHADE_DK_YELLOW ); break;
}
else
{
// sector not visited but air controlled
ShadeMapElem( cnt, cnt2, fAlreadyVisited ? MAP_SHADE_LT_GREEN : MAP_SHADE_DK_GREEN );
}
}
else if ( StrategicMap[cnt + cnt2 * WORLD_MAP_X].usAirType & AIRSPACE_ENEMY_ACTIVE )
{
// sector not visited and not air controlled
ShadeMapElem( cnt, cnt2, fAlreadyVisited ? MAP_SHADE_LT_RED : MAP_SHADE_DK_RED );
}
else
{
// sector not visited, currently nobody controls the airspace
//ShadeMapElem( cnt, cnt2, fAlreadyVisited ? MAP_SHADE_LT_BLUE : MAP_SHADE_MD_BLUE );
}
}
break;
case MAP_DISPLAY_AIRSPACE_COLOURED_SAMS: case MAP_DISPLAY_DISEASE:
{ {
BOOLEAN a = FALSE; FillMapColoursForDisease(colorMap);
BOOLEAN b = FALSE; ShadeMapElements(colorMap);
BOOLEAN c = FALSE; ShowDiseaseOnMap();
BOOLEAN d = FALSE; }
BOOLEAN samworking = FALSE; break;
for ( int i = 0; i < NUMBER_OF_SAMS; ++i )
{
if ( DoesSamCoverSector( i, SECTOR( cnt, cnt2 ), &samworking ) && samworking )
{
if ( i == 0 ) a = TRUE;
else if ( i == 1 ) b = TRUE;
else if ( i == 2 ) c = TRUE;
else if ( i == 3 ) d = TRUE;
}
}
if ( a && !b && !c && !d) case MAP_DISPLAY_WEATHER:
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED ); {
else if ( !a && b && !c && !d ) FillMapColoursForWeather(colorMap);
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_GREEN ); ShadeMapElements(colorMap);
else if ( !a && !b && c && !d ) }
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_BLUE ); break;
else if ( !a && !b && !c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_YELLOW );
else if ( a && b && !c && !d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_GREEN );
else if ( a && !b && c && !d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_BLUE );
else if ( a && !b && !c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_YELLOW );
else if ( !a && b && c && !d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_GREEN_BLUE );
else if ( !a && b && !c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_GREEN_YELLOW );
else if ( !a && !b && c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_BLUE_YELLOW );
else if ( a && b && c && !d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_GREEN_BLUE );
else if ( a && b && !c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_GREEN_YELLOW );
else if ( a && !b && c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_BLUE_YELLOW );
else if ( !a && b && c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_GREEN_BLUE_YELLOW );
else if ( a && b && c && d )
ShadeMapElem( cnt, cnt2, MAP_SHADE_MIX_RED_GREEN_BLUE_YELLOW );
}
break;
case MAP_DISPLAY_DISEASE:
ShadeMapElem( cnt, cnt2, GetMapColour( cnt, cnt2, 0 ) );
break;
case MAP_DISPLAY_WEATHER: case MAP_DISPLAY_INTEL:
ShadeMapElem( cnt, cnt2, GetMapColour( cnt, cnt2, 1 ) ); {
break; // This is the location where we should call lua and refill our intel data
extern void DetermineMapIntelData(INT32 asSectorZ);
DetermineMapIntelData(iCurrentMapSectorZ);
case MAP_DISPLAY_INTEL: FillMapColoursForIntel(colorMap);
ShadeMapElem( cnt, cnt2, GetMapColour( cnt, cnt2, 2 ) ); ShadeMapElements(colorMap);
break; }
break;
case MAP_DISPLAY_NORMAL: case MAP_DISPLAY_NORMAL:
default: default:
if ( GetSectorFlagStatus( cnt, cnt2, (UINT8)iCurrentMapSectorZ, SF_ALREADY_VISITED ) == FALSE ) {
{ fillMapColoursForVisitedSectors(colorMap);
// not visited ShadeMapElements(colorMap);
if ( gGameSettings.fOptions[TOPTION_ALT_MAP_COLOR] ) }
{ break;
// HEADROCK HAM 4: An alternate display for the map in normal mode. Unexplored sectors
// are in grey, similar to a recon map. Others are left in normal vivid color.
ShadeMapElem( cnt, cnt2, MAP_SHADE_DK_GREY );
}
else
{
ShadeMapElem( cnt, cnt2, MAP_SHADE_BLACK );
}
}
break;
}
}
}
} }
} }
// UNFORTUNATELY, WE CAN'T SHADE THESE ICONS AS PART OF SHADING THE MAP, BECAUSE FOR AIRSPACE, THE SHADE FUNCTION // UNFORTUNATELY, WE CAN'T SHADE THESE ICONS AS PART OF SHADING THE MAP, BECAUSE FOR AIRSPACE, THE SHADE FUNCTION
// DOESN'T MERELY SHADE THE EXISTING MAP SURFACE, BUT INSTEAD GRABS THE ORIGINAL GRAPHICS FROM BIGMAP, AND CHANGES // DOESN'T MERELY SHADE THE EXISTING MAP SURFACE, BUT INSTEAD GRABS THE ORIGINAL GRAPHICS FROM BIGMAP, AND CHANGES
// THEIR PALETTE. BLITTING ICONS PRIOR TO SHADING WOULD MEAN THEY DON'T SHOW UP IN AIRSPACE VIEW AT ALL. // THEIR PALETTE. BLITTING ICONS PRIOR TO SHADING WOULD MEAN THEY DON'T SHOW UP IN AIRSPACE VIEW AT ALL.
for (cnt = 1; cnt < NUM_TOWNS; ++cnt) for (INT16 cnt = 1; cnt < NUM_TOWNS; ++cnt)
{ {
if ( gfHiddenTown[cnt] && gfIconTown[cnt] && gfDrawHiddenTown[cnt] ) if (gfHiddenTown[cnt] && gfIconTown[cnt] && gfDrawHiddenTown[cnt])
{ {
sBaseSectorValue = sBaseSectorList[ cnt-1 ]; const INT16 sBaseSectorValue = sBaseSectorList[cnt - 1];
INT8 bTownId = GetTownIdForSector( SECTORX( sBaseSectorValue ), SECTORY( sBaseSectorValue ) ); const INT8 bTownId = GetTownIdForSector(SECTORX(sBaseSectorValue), SECTORY(sBaseSectorValue));
if ( /*bTownId != 0 &&*/ bTownId < NUM_TOWNS ) if (bTownId < NUM_TOWNS)
{ {
DrawIconL( gHiddenIcon[cnt].IconX, gHiddenIcon[cnt].IconY, cnt ); DrawIconL(gHiddenIcon[cnt].IconX, gHiddenIcon[cnt].IconY, cnt);
} }
} }
} }
/*
// if Orta found
if( fFoundOrta )
{
DrawOrta();
}
// if Tixa found
if( fFoundTixa )
{
DrawTixa();
}
*/
// draw SAM sites // draw SAM sites
ShowSAMSitesOnStrategicMap( ); ShowSAMSitesOnStrategicMap();
// draw mine icons // draw mine icons
for( iCounter = 0; iCounter < MAX_NUMBER_OF_MINES; ++iCounter ) for (INT32 iCounter = 0; iCounter < MAX_NUMBER_OF_MINES; ++iCounter)
{ {
//BlitMineIcon( gMineLocation[ iCounter ].sSectorX, gMineLocation[ iCounter ].sSectorY ); BlitMineIcon(gMineStatus[iCounter].sSectorX, gMineStatus[iCounter].sSectorY);
BlitMineIcon( gMineStatus[ iCounter ].sSectorX, gMineStatus[ iCounter ].sSectorY );
} }
// if mine details filter is set // if mine details filter is set
if( fShowMineFlag ) if (fShowMineFlag)
{ {
// show mine name/production text // show mine name/production text
for( iCounter = 0; iCounter < MAX_NUMBER_OF_MINES; ++iCounter ) for (INT32 iCounter = 0; iCounter < MAX_NUMBER_OF_MINES; ++iCounter)
{ {
//BlitMineText( gMineLocation[ iCounter ].sSectorX, gMineLocation[ iCounter ].sSectorY ); BlitMineText(gMineStatus[iCounter].sSectorX, gMineStatus[iCounter].sSectorY);
BlitMineText( gMineStatus[ iCounter ].sSectorX, gMineStatus[ iCounter ].sSectorY );
} }
} }
// draw towns names & loyalty ratings, and grey town limit borders // draw towns names & loyalty ratings, and grey town limit borders
if( fShowTownFlag ) if (fShowTownFlag)
{ {
BlitTownGridMarkers( ); BlitTownGridMarkers();
ShowTownText( ); ShowTownText();
} }
// draw militia icons // draw militia icons
if( fShowMilitia ) if (fShowMilitia)
{ {
DrawTownMilitiaForcesOnMap( ); DrawTownMilitiaForcesOnMap();
} }
if ( is_networked //haydent (allow client to see map deployment bullseye) if ((gusMapDisplayColourMode == MAP_DISPLAY_AIRSPACE || gusMapDisplayColourMode == MAP_DISPLAY_AIRSPACE_COLOURED_SAMS) && !gfInChangeArrivalSectorMode)
|| (( gusMapDisplayColourMode == MAP_DISPLAY_AIRSPACE || gusMapDisplayColourMode == MAP_DISPLAY_AIRSPACE_COLOURED_SAMS ) && !gfInChangeArrivalSectorMode ) )
{ {
DrawBullseye(); DrawBullseye();
} }
else if (is_networked)
{
DrawBullseye();//haydent (allow client to see map deployment bullseye)
}
} }
else else
{ {
HandleLowerLevelMapBlit( ); HandleLowerLevelMapBlit();
} }
// show mine outlines even when viewing underground sublevels - they indicate where the mine entrances are // show mine outlines even when viewing underground sublevels - they indicate where the mine entrances are
if ( fShowMineFlag ) if (fShowMineFlag)
{ {
// draw grey mine sector borders // draw grey mine sector borders
BlitMineGridMarkers( ); BlitMineGridMarkers();
} }
// do not show mercs/vehicles when airspace is ON
// commented out on a trial basis! if (fShowTeamFlag)
// if( gusMapDisplayColourMode != MAP_DISPLAY_AIRSPACE )
{ {
if( fShowTeamFlag )
ShowTeamAndVehicles( SHOW_TEAMMATES | SHOW_VEHICLES );
else
HandleShowingOfEnemiesWithMilitiaOn( );
/*
if((fShowTeamFlag)&&(fShowVehicleFlag))
ShowTeamAndVehicles(SHOW_TEAMMATES | SHOW_VEHICLES); ShowTeamAndVehicles(SHOW_TEAMMATES | SHOW_VEHICLES);
else if(fShowTeamFlag) }
ShowTeamAndVehicles(SHOW_TEAMMATES); else
else if(fShowVehicleFlag) {
ShowTeamAndVehicles(SHOW_VEHICLES); HandleShowingOfEnemiesWithMilitiaOn();
else
{
HandleShowingOfEnemiesWithMilitiaOn( );
}
*/
} }
if ( fShowItemsFlag )
if (fShowItemsFlag)
{ {
ShowItemsOnMap(); ShowItemsOnMap();
} }
if ( gusMapDisplayColourMode == MAP_DISPLAY_DISEASE )
{
ShowDiseaseOnMap( );
}
DisplayLevelString( ); DisplayLevelString();
RestoreClipRegionToFullScreen( ); RestoreClipRegionToFullScreen();
// Flugente: this function does not do anything... so I'm commenting its use out return(TRUE);
//CheckForSoldiersWhoRetreatedIntoMilitiaHeldSectors();
return( TRUE );
} }
@@ -1581,6 +1614,135 @@ BOOLEAN ShadeMapElem( INT16 sMapX, INT16 sMapY, INT32 iColor )
} }
BOOLEAN ShadeMapElements(const INT32(&colorMap)[ MAXIMUM_VALID_Y_COORDINATE ][ MAXIMUM_VALID_X_COORDINATE ])
{
// get original video surface palette
HVSURFACE hSrcVSurface;
CHECKF(GetVideoSurface(&hSrcVSurface, guiBIGMAP));
UINT16 * const pOriginalPallette = hSrcVSurface->p16BPPPalette;
// Lock source buffer
UINT32 uiSrcPitchBYTES;
UINT8 *pSrcBuffer;
pSrcBuffer = LockVideoSurface(guiBIGMAP, &uiSrcPitchBYTES);
// get SAVEBUFFER
HVSURFACE hVSurface;
CHECKF(GetVideoSurface(&hVSurface, guiSAVEBUFFER));
// Lock destination buffer
UINT32 uiDestPitch;
UINT16 *pDestBuffer;
pDestBuffer = (UINT16*)LockVideoSurface(guiSAVEBUFFER, &uiDestPitch);
if (pDestBuffer == NULL)
{
return(FALSE);
}
for (INT16 y = 0; y < MAXIMUM_VALID_Y_COORDINATE; ++y)
{
for (INT16 x = 0; x < MAXIMUM_VALID_X_COORDINATE; ++x)
{
const INT16 mapX = x + MINIMUM_VALID_X_COORDINATE;
const INT16 mapY = y + MINIMUM_VALID_Y_COORDINATE;
INT16 sScreenX, sScreenY;
GetScreenXYFromMapXY(mapX, mapY, &sScreenX, &sScreenY);
// compensate for original BIG_MAP blit being done at MAP_VIEW_START_X + 1
sScreenX += 1;
// compensate for original BIG_MAP blit being done at MAP_VIEW_START_X + 1
SGPRect clip;
clip.iLeft = 2 * (sScreenX - (MAP_VIEW_START_X + 1));
clip.iTop = 2 * (sScreenY - MAP_VIEW_START_Y);
clip.iRight = clip.iLeft + (2 * MAP_GRID_X);
clip.iBottom = clip.iTop + (2 * MAP_GRID_Y);
const auto iColor = colorMap[y][x];
if (iColor == MAP_SHADE_BLACK)
{
// non-airspace
sScreenY -= 1;
auto X1 = sScreenX;
auto Y1 = sScreenY;
auto X2 = sScreenX + MAP_GRID_X - 1;
auto Y2 = sScreenY + MAP_GRID_Y - 1;
#ifdef _DEBUG
if (X1 < 0)
X1 = 0;
if (X2 < 0)
continue;
//return(FALSE);
if (Y2 < 0)
continue;
//return(FALSE);
if (Y1 < 0)
Y1 = 0;
if (X2 >= hVSurface->usWidth)
X2 = hVSurface->usWidth - 1;
if (Y2 >= hVSurface->usHeight)
Y2 = hVSurface->usHeight - 1;
if (X1 >= hVSurface->usWidth)
continue;
//return(FALSE);
if (Y1 >= hVSurface->usHeight)
continue;
//return(FALSE);
if ((X2 - X1) <= 0)
continue;
//return(FALSE);
if ((Y2 - Y1) <= 0)
continue;
//return(FALSE);
#endif
SGPRect area;
area.iTop = Y1;
area.iBottom = Y2;
area.iLeft = X1;
area.iRight = X2;
// Now we have the video object and surface, call the shadow function
Blt16BPPBufferShadowRect(pDestBuffer, uiDestPitch, &area);
}
else if (iColor < MAP_SHADE_MAX)
{
// Set palette for shading
hSrcVSurface->p16BPPPalette = pMapPalette[iColor];
Blt8BPPDataTo16BPPBufferHalfRect(pDestBuffer, uiDestPitch, hSrcVSurface, pSrcBuffer, uiSrcPitchBYTES, sScreenX, sScreenY, &clip);
}
}
}
// unlock source and dest buffers
UnLockVideoSurface(guiBIGMAP);
UnLockVideoSurface(guiSAVEBUFFER);
// restore original palette
CHECKF(GetVideoSurface(&hSrcVSurface, guiBIGMAP));
hSrcVSurface->p16BPPPalette = pOriginalPallette;
return (TRUE);
}
void InitializeMilitiaPopup(void) void InitializeMilitiaPopup(void)
{ {
UINT16 xVal = 330 + xResOffset; UINT16 xVal = 330 + xResOffset;