warzone2100/src/advvis.cpp

120 lines
3.6 KiB
C++

/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2013 Warzone 2100 Project
Warzone 2100 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Warzone 2100 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file advvis.c
*
* Makes smooth transitions for terrain visibility.
*/
#include "lib/framework/frame.h"
#include "advvis.h"
#include "map.h"
// ------------------------------------------------------------------------------------
#define FADE_IN_TIME (GAME_TICKS_PER_SEC/10)
#define START_DIVIDE (8)
#define MIN_ILLUM (45.0f)
/// Whether unexplored tiles should be shown as just darker fog. Left here as a future option
/// for scripts, since campaign may still want total darkness on unexplored tiles.
static bool bRevealActive = true;
// ------------------------------------------------------------------------------------
void avUpdateTiles( void )
{
const int len = mapHeight * mapWidth;
const int playermask = 1 << selectedPlayer;
UDWORD i = 0;
float maxLevel, increment = graphicsTimeAdjustedIncrement(FADE_IN_TIME); // call once per frame
MAPTILE *psTile;
/* Go through the tiles */
for (psTile = psMapTiles; i < len; i++)
{
maxLevel = psTile->illumination;
if (psTile->level > MIN_ILLUM || psTile->tileExploredBits & playermask) // seen
{
// If we are not omniscient, and we are not seeing the tile, and none of our allies see the tile...
if (!godMode && !(alliancebits[selectedPlayer] & (satuplinkbits | psTile->sensorBits)))
{
maxLevel /= 2;
}
if (psTile->level > maxLevel)
{
psTile->level = MAX(psTile->level - increment, maxLevel);
}
else if (psTile->level < maxLevel)
{
psTile->level = MIN(psTile->level + increment, maxLevel);
}
}
psTile++;
}
}
// ------------------------------------------------------------------------------------
UDWORD avGetObjLightLevel(BASE_OBJECT *psObj,UDWORD origLevel)
{
float div = (float)psObj->visible[selectedPlayer] / 255.f;
unsigned int lowest = origLevel / START_DIVIDE;
unsigned int newLevel = div * origLevel;
if (newLevel < lowest)
{
newLevel = lowest;
}
return newLevel;
}
// ------------------------------------------------------------------------------------
bool getRevealStatus( void )
{
return bRevealActive;
}
// ------------------------------------------------------------------------------------
void setRevealStatus( bool val )
{
debug(LOG_FOG, "avSetRevealStatus: Setting reveal to %s", val ? "ON" : "OFF");
bRevealActive = val;
}
// ------------------------------------------------------------------------------------
void preProcessVisibility( void )
{
for (int i = 0; i < mapWidth; i++)
{
for (int j = 0; j < mapHeight; j++)
{
MAPTILE *psTile = mapTile(i,j);
psTile->level = bRevealActive ? MIN(MIN_ILLUM, psTile->illumination / 4.0f) : 0;
if (TEST_TILE_VISIBLE(selectedPlayer, psTile))
{
psTile->level = psTile->illumination;
}
}
}
}
// ------------------------------------------------------------------------------------