From 102ca8f651f90292dda1af7ea0a5c5f5bd7b8454 Mon Sep 17 00:00:00 2001 From: SoftCoder Date: Mon, 31 Oct 2016 13:56:33 -0700 Subject: [PATCH] - Fixed issue# 135 --- source/glest_game/world/world.cpp | 66 +++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index 74fb6f7d..1bc995ef 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -2483,6 +2483,12 @@ bool World::showWorldForPlayer(int factionIndex, bool excludeFogOfWarCheck) cons ret = true; } else if(factionIndex == thisFactionIndex && game != NULL) { + + //printf("Show FOW thisTeamIndex = %d (%d) game->getGameOver() = %d game->getGameSettings()->isNetworkGame() = %d game->getGameSettings()->getEnableObserverModeAtEndGame() = %d thisFactionIndex = %d Is Winning Faction = %d\n", + // thisTeamIndex,(GameConstants::maxPlayers -1 + fpt_Observer),game->getGameOver(), + // game->getGameSettings()->isNetworkGame(),game->getGameSettings()->getEnableObserverModeAtEndGame(), + // thisFactionIndex,getStats()->getVictory(thisFactionIndex)); + // Player is an Observer if(thisTeamIndex == GameConstants::maxPlayers -1 + fpt_Observer) { ret = true; @@ -2520,6 +2526,7 @@ bool World::showWorldForPlayer(int factionIndex, bool excludeFogOfWarCheck) cons } } } + //printf("showWorldForPlayer for %d is: %d\n",factionIndex,ret); return ret; } @@ -2550,26 +2557,33 @@ void World::computeFow() { } } int resetFowAlphaFactionCount = 0; - for(int indexFaction = 0; - indexFaction < GameConstants::maxPlayers + GameConstants::specialFactions; - ++indexFaction) { + + for(int factionIndex = 0; factionIndex < GameConstants::maxPlayers + GameConstants::specialFactions; ++factionIndex) { + if(factionIndex >= getFactionCount()) { + continue; + } + Faction *faction = getFaction(factionIndex); +// for(int indexTeamFaction = 0; +// indexTeamFaction < GameConstants::maxPlayers + GameConstants::specialFactions; +// ++indexTeamFaction) { // If fog of war enabled set cell visible to false and later set those close to units to true if(fogOfWar) { for(int indexSurfaceW = 0; indexSurfaceW < map.getSurfaceW(); ++indexSurfaceW) { for(int indexSurfaceH = 0; indexSurfaceH < map.getSurfaceH(); ++indexSurfaceH) { // set all cells to not visible - map.getSurfaceCell(indexSurfaceW, indexSurfaceH)->setVisible(indexFaction, false); + map.getSurfaceCell(indexSurfaceW, indexSurfaceH)->setVisible(faction->getTeam(), false); } } } - if(!fogOfWar || (indexFaction != thisTeamIndex)) { - bool showWorldForFaction = showWorldForPlayer(indexFaction); + // Remove fog of war for factions NOT on my team which i can see + if(!fogOfWar || (faction->getTeam() != thisTeamIndex)) { + bool showWorldForFaction = showWorldForPlayer(factionIndex); + //printf("showWorldForFaction indexFaction = %d thisTeamIndex = %d showWorldForFaction = %d\n",indexFaction,thisTeamIndex,showWorldForFaction); if(showWorldForFaction == true) { resetFowAlphaFactionCount++; } - for(int indexSurfaceW = 0; indexSurfaceW < map.getSurfaceW(); ++indexSurfaceW) { for(int indexSurfaceH = 0; indexSurfaceH < map.getSurfaceH(); ++indexSurfaceH) { // reset fog of ware texture alpha values @@ -2598,6 +2612,39 @@ void World::computeFow() { } } } + // Remove fog of war for factions on my team + else if(fogOfWar && (faction->getTeam() == thisTeamIndex)) { + bool showWorldForFaction = showWorldForPlayer(factionIndex); + //printf("#2 showWorldForFaction thisFactionIndex = %d thisTeamIndex = %d showWorldForFaction = %d\n",thisFactionIndex,thisTeamIndex,showWorldForFaction); + if(showWorldForFaction == true) { + for(int indexSurfaceW = 0; indexSurfaceW < map.getSurfaceW(); ++indexSurfaceW) { + for(int indexSurfaceH = 0; indexSurfaceH < map.getSurfaceH(); ++indexSurfaceH) { + // reset fog of ware texture alpha values + if(!fogOfWar || (cacheFowAlphaTexture == false && + showWorldForFaction == true)) { + const Vec2i surfPos(indexSurfaceW,indexSurfaceH); + + //compute max alpha + float maxAlpha= 0.0f; + if(surfPos.x > 1 && surfPos.y > 1 && + surfPos.x < map.getSurfaceW() - 2 && + surfPos.y < map.getSurfaceH() - 2) { + maxAlpha= 1.f; + } + else if(surfPos.x > 0 && surfPos.y > 0 && + surfPos.x < map.getSurfaceW() - 1 && + surfPos.y < map.getSurfaceH() - 1){ + maxAlpha= 0.3f; + } + + // compute alpha + float alpha = maxAlpha; + minimap.incFowTextureAlphaSurface(surfPos, alpha); + } + } + } + } + } if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s] Line: %d in frame: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,getFrameCount()); } @@ -2620,10 +2667,11 @@ void World::computeFow() { for(int factionIndex = 0; factionIndex < getFactionCount(); ++factionIndex) { Faction *faction = getFaction(factionIndex); bool cellVisibleForFaction = showWorldForPlayer(thisFactionIndex); + //printf("computeFow thisFactionIndex = %d factionIndex = %d thisTeamIndex = %d faction->getTeam() = %d cellVisibleForFaction = %d\n",thisFactionIndex,factionIndex,thisTeamIndex,faction->getTeam(),cellVisibleForFaction); + int unitCount = faction->getUnitCount(); for(int unitIndex = 0; unitIndex < unitCount; ++unitIndex) { Unit *unit= faction->getUnit(unitIndex); - // exploration unit->exploreCells(); @@ -2647,6 +2695,8 @@ void World::computeFow() { faction->getTeam() == thisTeamIndex && unit->isOperative() == true) { + //printf("computeFow unit->isOperative() == true\n"); + const FowAlphaCellsLookupItem &cellList = unit->getCachedFow(); for(std::map::const_iterator iterMap = cellList.surfPosAlphaList.begin(); iterMap != cellList.surfPosAlphaList.end(); ++iterMap) {