diff --git a/src/map/map_fog.cpp b/src/map/map_fog.cpp index f137da65b..29cca2b4a 100644 --- a/src/map/map_fog.cpp +++ b/src/map/map_fog.cpp @@ -228,7 +228,7 @@ global int IsTileVisible(const Player* player,int x,int y) return 2; } visiontype=TheMap.Fields[y*TheMap.Width+x].Visible[player->Player]; - for( i=0; i<PlayerMax; i++ ) { + for( i=0; i<PlayerMax && visiontype < 2; i++ ) { if( player->SharedVision&(1<<i) && (Players[i].SharedVision&(1<<player->Player)) ) { if( visiontype<TheMap.Fields[y*TheMap.Width+x].Visible[i] ) { @@ -239,6 +239,9 @@ global int IsTileVisible(const Player* player,int x,int y) return 2; } } + if (TheMap.NoFogOfWar == 1 && visiontype != 0) { + return 2; + } return visiontype; } @@ -297,10 +300,6 @@ global void MapMarkSight(const Player* player,int tx,int ty,int range) switch( v ) { case 0: // Unexplored case 1: // Unseen - if( IsTileVisible(ThisPlayer,i,y) > 1) { - MapMarkSeenTile(i,y); - } - // FIXME: mark for screen update TheMap.Fields[i+y*TheMap.Width].Visible[p]=2; break; @@ -312,6 +311,9 @@ global void MapMarkSight(const Player* player,int tx,int ty,int range) TheMap.Fields[i+y*TheMap.Width].Visible[p]=v+1; break; } + if( IsTileVisible(ThisPlayer,i,y) > 1) { + MapMarkSeenTile(i,y); + } } } ++y; @@ -375,26 +377,13 @@ global void MapUnmarkSight(const Player* player,int tx,int ty,int range) TheMap.Fields[i+y*TheMap.Width].Visible[p] = LookupSight(player,i,y); if (FlagRevealMap == 1 && - TheMap.Fields[i+y*TheMap.Width].Visible[p] == 0) { - TheMap.Fields[i+y*TheMap.Width].Visible[p] = 1; - } - if (TheMap.NoFogOfWar == 1 && - TheMap.Fields[i+y*TheMap.Width].Visible[p] < 2) { - TheMap.Fields[i+y*TheMap.Width].Visible[p] = 2; - } - if (FlagRevealMap && TheMap.Fields[i+y*TheMap.Width].Visible[p] < 255) { - TheMap.Fields[i+y*TheMap.Width].Visible[p] += 1; + ++TheMap.Fields[i+y*TheMap.Width].Visible[p]; } case 0: // Unexplored case 1: //We are at minimum, don't do anything. break; - case 2: - //We don't want to do fow, when we don't want it. - if ( TheMap.NoFogOfWar ) { - break; - } default: // seen -> seen TheMap.Fields[i+y*TheMap.Width].Visible[p]=v-1; break; @@ -607,19 +596,8 @@ global void UpdateFogOfWarChange(void) w=TheMap.Width; for( y=0; y<TheMap.Height; y++ ) { for( x=0; x<TheMap.Width; ++x ) { -#ifdef NEW_FOW - if( IsTileVisible(ThisPlayer,x,y) ) { - int p; - - for( p=0; p<PlayerMax; ++p ) { - if(TheMap.Fields[x+y*w].Visible[p]<2 ) { - TheMap.Fields[x+y*w].Visible[p]=2; - } else { - TheMap.Fields[x+y*w].Visible[p]++; - } - } -#else if( IsMapFieldExplored(x,y) ) { +#ifndef NEW_FOW TheMap.Visible[0][(x+y*w)/32] |= 1<<((x+y*w)%32); #endif MapMarkSeenTile( x,y ); @@ -627,40 +605,6 @@ global void UpdateFogOfWarChange(void) } } } -#ifdef NEW_FOW - else { - int p; - int numunits; - Unit* units[UnitMax]; - - for( y=0; y<TheMap.Height; y++ ) { - for( x=0; x<TheMap.Width; ++x ) { - for( p=0; p<PlayerMax; ++p ) { - if( TheMap.Fields[x+y*TheMap.Width].Visible[p] ) { - TheMap.Fields[x+y*TheMap.Width].Visible[p]=1; - } - } - } - } - for( y=0; y<TheMap.Height; y++ ) { - for( x=0; x<TheMap.Width; ++x ) { - // Find and Mark each unit - numunits = SelectUnitsOnTile(x,y,units); - --numunits; - while( numunits>=0 ) { - int tx; - int ty; - - tx=units[numunits]->X+units[numunits]->Type->TileWidth/2; - ty=units[numunits]->Y+units[numunits]->Type->TileHeight/2; - MapMarkSight(units[numunits]->Player,tx,ty, - units[numunits]->Stats->SightRange); - --numunits; - } - } - } - } -#endif MarkDrawEntireMap(); } @@ -1853,7 +1797,6 @@ global void VideoDrawOnlyFogAlphaOpenGL( */ local void DrawFogOfWarTile(int sx,int sy,int dx,int dy) { -#ifdef NEW_FOW int w; int tile; int tile2; @@ -1870,66 +1813,66 @@ local void DrawFogOfWarTile(int sx,int sy,int dx,int dy) // if( sy ) { if( sx!=sy ) { - if( IsTileVisible(ThisPlayer,x-1,y-1) == 0 ) { + if( !IsMapFieldExplored(x-1,y-1) ) { tile2|=2; tile|=2; - } else if( IsTileVisible(ThisPlayer,x-1,y-1) == 1) { + } else if( !IsMapFieldVisible(x-1,y-1) ) { tile|=2; } } - if( !(IsTileVisible(ThisPlayer,x,y-1)) ) { + if( !IsMapFieldExplored(x,y-1) ) { tile2|=3; tile|=3; - } else if( (IsTileVisible(ThisPlayer,x,y-1)) == 1) { + } else if( !IsMapFieldVisible(x,y-1) ) { tile|=3; } if( sx!=sy+w-1 ) { - if( !(IsTileVisible(ThisPlayer,x+1,y-1)) ) { + if( !IsMapFieldExplored(x+1,y-1) ) { tile2|=1; tile|=1; - } else if( (IsTileVisible(ThisPlayer,x+1,y-1) == 1)) { + } else if( !IsMapFieldVisible(x+1,y-1) ) { tile|=1; } } } if( sx!=sy ) { - if( !(IsTileVisible(ThisPlayer,x-1,y)) ) { + if( !IsMapFieldExplored(x-1,y) ) { tile2|=10; tile|=10; - } else if( (IsTileVisible(ThisPlayer,x-1,y) == 1)) { + } else if( !IsMapFieldVisible(x-1,y) ) { tile|=10; } } if( sx!=sy+w-1 ) { - if( !(IsTileVisible(ThisPlayer,x+1,y)) ) { + if( !IsMapFieldExplored(x+1,y) ) { tile2|=5; tile|=5; - } else if( (IsTileVisible(ThisPlayer,x+1,y) == 1 ) ) { + } else if( !IsMapFieldVisible(x+1,y) ) { tile|=5; } } if( sy+w<TheMap.Height*w ) { if( sx!=sy ) { - if( !(IsTileVisible(ThisPlayer,x-1,y+1)) ) { + if( !IsMapFieldExplored(x-1,y+1) ) { tile2|=8; tile|=8; - } else if( (IsTileVisible(ThisPlayer,x-1,y+1) == 1) ) { + } else if( !IsMapFieldVisible(x-1,y+1) ) { tile|=8; } } - if( !(IsTileVisible(ThisPlayer,x,y+1)) ) { + if( !IsMapFieldExplored(x,y+1) ) { tile2|=12; tile|=12; - } else if( (IsTileVisible(ThisPlayer,x,y+1) == 1) ) { + } else if( !IsMapFieldVisible(x,y+1) ) { tile|=12; } if( sx!=sy+w-1 ) { - if( !(IsTileVisible(ThisPlayer,x+1,y+1)) ) { + if( !IsMapFieldExplored(x+1,y+1) ) { tile2|=4; tile|=4; - } else if( (IsTileVisible(ThisPlayer,x+1,y+1) == 1) ) { + } else if( !IsMapFieldVisible(x+1,y+1) ) { tile|=4; } } @@ -1947,7 +1890,7 @@ local void DrawFogOfWarTile(int sx,int sy,int dx,int dy) tile=0; } } - if( IsTileVisible(ThisPlayer,x,y) > 1 ) { + if( IsMapFieldVisible(x,y) ) { if( tile ) { VideoDrawFog(TheMap.Tiles[tile],dx,dy); // TheMap.Fields[sx].VisibleLastFrame|=MapFieldPartiallyVisible; @@ -1956,112 +1899,7 @@ local void DrawFogOfWarTile(int sx,int sy,int dx,int dy) } } else { VideoDrawOnlyFog(TheMap.Tiles[UNEXPLORED_TILE],dx,dy); - } - -#else - int w; - int tile; - int tile2; - - w=TheMap.Width; - tile=tile2=0; - // - // Check each field around it - // - if( sy ) { - if( sx!=sy ) { - if( !(TheMap.Fields[sx-w-1].Flags&MapFieldExplored) ) { - tile2|=2; - tile|=2; - } else if( !(TheMap.Visible[0][(sx-w-1)/32]&(1<<((sx-w-1)%32)) ) ) { - tile|=2; - } - } - if( !(TheMap.Fields[sx-w].Flags&MapFieldExplored) ) { - tile2|=3; - tile|=3; - } else if( !(TheMap.Visible[0][(sx-w)/32]&(1<<((sx-w)%32)) ) ) { - tile|=3; - } - if( sx!=sy+w-1 ) { - if( !(TheMap.Fields[sx-w+1].Flags&MapFieldExplored) ) { - tile2|=1; - tile|=1; - } else if( !(TheMap.Visible[0][(sx-w+1)/32]&(1<<((sx-w+1)%32)) ) ) { - tile|=1; - } - } - } - - if( sx!=sy ) { - if( !(TheMap.Fields[sx-1].Flags&MapFieldExplored) ) { - tile2|=10; - tile|=10; - } else if( !(TheMap.Visible[0][(sx-1)/32]&(1<<((sx-1)%32)) ) ) { - tile|=10; - } - } - if( sx!=sy+w-1 ) { - if( !(TheMap.Fields[sx+1].Flags&MapFieldExplored) ) { - tile2|=5; - tile|=5; - } else if( !(TheMap.Visible[0][(sx+1)/32]&(1<<((sx+1)%32)) ) ) { - tile|=5; - } - } - - if( sy+w<TheMap.Height*w ) { - if( sx!=sy ) { - if( !(TheMap.Fields[sx+w-1].Flags&MapFieldExplored) ) { - tile2|=8; - tile|=8; - } else if( !(TheMap.Visible[0][(sx+w-1)/32]&(1<<((sx+w-1)%32)) ) ) { - tile|=8; - } - } - if( !(TheMap.Fields[sx+w].Flags&MapFieldExplored) ) { - tile2|=12; - tile|=12; - } else if( !(TheMap.Visible[0][(sx+w)/32]&(1<<((sx+w)%32)) ) ) { - tile|=12; - } - if( sx!=sy+w-1 ) { - if( !(TheMap.Fields[sx+w+1].Flags&MapFieldExplored) ) { - tile2|=4; - tile|=4; - } else if( !(TheMap.Visible[0][(sx+w+1)/32]&(1<<((sx+w+1)%32))) ) { - tile|=4; - } - } - } - - //TheMap.Fields[sx].VisibleLastFrame=0; - // - // Draw unexplored area - // If only partly or total invisible draw fog of war. - // - tile=FogTable[tile]; - tile2=FogTable[tile2]; - if( tile2) { - VideoDrawUnexplored(TheMap.Tiles[tile2],dx,dy); - if( tile2==tile ) { // no same fog over unexplored -// if( tile != 0xf ) { -// TheMap.Fields[sx].VisibleLastFrame|=MapFieldPartiallyVisible; -// } - tile=0; - } - } - if( TheMap.Visible[0][sx/32]&(1<<(sx%32)) ) { - if( tile ) { - VideoDrawFog(TheMap.Tiles[tile],dx,dy); -// TheMap.Fields[sx].VisibleLastFrame|=MapFieldPartiallyVisible; -// } else { -// TheMap.Fields[sx].VisibleLastFrame|=MapFieldCompletelyVisible; - } - } else { - VideoDrawOnlyFog(TheMap.Tiles[UNEXPLORED_TILE],dx,dy); - } -#endif + } } #ifdef HIERARCHIC_PATHFINDER diff --git a/src/stratagus/missile.cpp b/src/stratagus/missile.cpp index f85585de5..6fc677b44 100644 --- a/src/stratagus/missile.cpp +++ b/src/stratagus/missile.cpp @@ -600,6 +600,8 @@ global void FireMissile(Unit* unit) if( goal && RevealAttacker ) { // attacking units are seen #ifdef NEW_FOW + // FIXME: Need a way to temporarily mark this tile, place a TTL + // FIXME: Unit is the best solution, but need other fixes first. MapMarkSight(goal->Player,unit->X,unit->Y,1); #else if( goal->Player==ThisPlayer || IsSharedVision(ThisPlayer,goal) ) { diff --git a/src/unit/unit.cpp b/src/unit/unit.cpp index fd2bcedd5..c07f291ad 100644 --- a/src/unit/unit.cpp +++ b/src/unit/unit.cpp @@ -951,43 +951,6 @@ global void MarkSubmarineSeen(const Player* player,int x,int y,int r) */ global int UnitVisibleOnMap(const Unit* unit) { -#ifdef NEW_FOW - int x; - int y; - int w; - int w0; - int h; - - DebugCheck( !unit->Type ); // FIXME: Can this happen, if yes it is a bug - //DebugCheck( unit->Player==ThisPlayer ); - - // - // Unit invisible (by spell), removed or submarine. - // - if ( unit->Invisible || unit->Removed - || !(unit->Visible&(1<<ThisPlayer->Player)) ) { - return 0; - } - - x = unit->X; - y = unit->Y; - w = w0 = unit->Type->TileWidth; - h = unit->Type->TileHeight; - - // - // Check if visible, not under fog of war. - // FIXME: need only check the boundary, not the complete rectangle. - // - for( ; h-->0; ) { - for( w=w0; w-->0; ) { - if( IsMapFieldVisible(x+w,y+h) ) { - return 1; - } - } - } - - return 0; -#else int x; int y; int w; @@ -1022,7 +985,6 @@ global int UnitVisibleOnMap(const Unit* unit) } return 0; -#endif } /**