From 84582d1930b42e058c3a3ca85f793383d66d65a1 Mon Sep 17 00:00:00 2001
From: johns <>
Date: Fri, 28 Apr 2000 20:36:33 +0000
Subject: [PATCH] macros MAPFIELD,MAPMOVE,IMMAP,INMAP,... removed

---
 include/map.h      |  17 ++--
 map/map.cpp        | 197 +++++++++++++++++++++++++++++++--------------
 map/map_fog.cpp    |   2 +-
 map/map_rock.cpp   | 101 ++++++++++++++---------
 map/map_wall.cpp   |  34 +++++---
 map/map_wood.cpp   |  72 +++++++++++------
 ui/mouse.cpp       |   8 +-
 unit/unit_draw.cpp |  12 +--
 8 files changed, 282 insertions(+), 161 deletions(-)

diff --git a/include/map.h b/include/map.h
index 89e4ef301..b5c627473 100644
--- a/include/map.h
+++ b/include/map.h
@@ -72,8 +72,10 @@ typedef struct _map_field_ {
 #endif
 } MapField;
 
+#ifndef NEW_FOW
 #define MapFieldVisible		0x0001	/// Field visible
 #define MapFieldExplored	0x0002	/// Field explored
+#endif
 
 #define MapFieldArray		0x0004	/// More than one unit on the field
 
@@ -254,18 +256,17 @@ extern void MapSetWall(unsigned x,unsigned y,int humanwall);
 --	Defines
 ----------------------------------------------------------------------------*/
 
+    /// Can an unit with 'mask' can enter the field.
 #define CanMoveToMask(x,y,mask) \
 	!(TheMap.Fields[(x)+(y)*TheMap.Width].Flags&(mask))
 
-#define    MAPFIELD(xx,yy) TheMap.Fields[(xx)+(yy)*TheMap.Width]
-#define     MAPMOVE(xx,yy) TheMap.MovementMap[(xx)+(yy)*TheMap.Width]
-#define       INMAP(xx,yy) ((xx)>=0&&(yy)>=0&&(xx)<TheMap.Width&&(yy)<TheMap.Height)
-#define  MAPVISIBLE(xx,yy) (INMAP(xx,yy) ? !!(TheMap.Fields[(yy)*TheMap.Width+(xx)].Flags&MapFieldVisible ) : 1)
-#define MAPEXPLORED(xx,yy) (INMAP(xx,yy) ? !!(TheMap.Fields[(yy)*TheMap.Width+(xx)].Flags&MapFieldExplored) : 1)
+    /// Check if a field for the user is explored
+#define IsMapFieldExplored(x,y) \
+    (TheMap.Fields[(y)*TheMap.Width+(x)].Flags&MapFieldExplored)
 
-#define MAPTILE(xx,yy) (MAPFIELD(xx,yy).Tile)
-#define MAPSEENTILE(xx,yy) (MAPFIELD(xx,yy).SeenTile)
-#define TILETYPE(tile) (TheMap.Tileset->TileTypeTable[tile])
+    /// Check if a field for the user is visibile
+#define IsMapFieldVisible(x,y) \
+    (TheMap.Fields[(y)*TheMap.Width+(x)].Flags&MapFieldVisible)
 
 #define UNEXPLORED_TILE 0
 
diff --git a/map/map.cpp b/map/map.cpp
index 45e76c7dd..af316f67e 100644
--- a/map/map.cpp
+++ b/map/map.cpp
@@ -143,54 +143,63 @@ global void SaveMap(FILE* file)
 }
 
 /*----------------------------------------------------------------------------
---
+--	Visibile and explored handling
 ----------------------------------------------------------------------------*/
 
 /**
 **      Marks seen tile -- used mainly for the Fog Of War
+**
+**	@param x	Map X position.
+**	@param y	Map Y position.
 */
 global void MapMarkSeenTile( int x, int y )
 {
-  int t, st; // tile, seentile
+    int t, st; // tile, seentile
+    MapField* mf;
 
-  if (MAPFIELD(x,y).SeenTile == MAPFIELD(x,y).Tile) return;
-
-  t  = MAPFIELD(x,y).Tile;
-  st = MAPFIELD(x,y).SeenTile;
-  MAPFIELD(x,y).SeenTile = MAPFIELD(x,y).Tile;
-
-  if( !TheMap.Tileset ) return;	// FIXME: this is needed, because tileset
-				// is loaded after this function is needed
-				// LoadPud, PlaceUnit, ... MapMarkSeenTile
-
-  // handle WOODs
-
-  if ( st != TheMap.Tileset->NoWoodTile && t == TheMap.Tileset->NoWoodTile )
-    MapFixWood( x, y );
-  else
-  if ( st == TheMap.Tileset->NoWoodTile && t != TheMap.Tileset->NoWoodTile )
-    FixWood( x, y );
-  else
-  if ( MapWoodChk( x, y ) && t != st )
-    {
-    FixWood( x, y );
-    MapFixWood( x, y );
+    mf=TheMap.Fields+x+y*TheMap.Width;
+    t  = mf->Tile;
+    st = mf->SeenTile;
+    if ( st == t ) {			// Nothing changed.
+	return;
     }
 
-  // handle WALLs
-#define ISTILEWALL(t) (TILETYPE(t) == TileTypeHWall || TILETYPE(t) == TileTypeOWall)
-  if ( ISTILEWALL(st) && !ISTILEWALL(st) )
-    MapFixWall( x, y );
-  else
-  if ( !ISTILEWALL(st) && ISTILEWALL(st) )
-    FixWall( x, y );
-  else
-  if ( MapWallChk( x, y, -1 ) && t != st )
-    {
-    FixWall( x, y );
-    MapFixWall( x, y );
+    mf->SeenTile=t;
+
+    // FIXME: this is needed, because tileset is loaded after this function
+    //		is needed LoadPud, PlaceUnit, ... MapMarkSeenTile
+    if( !TheMap.Tileset ) {
+	return;
     }
-};
+
+    // handle WOODs
+
+    if ( st != TheMap.Tileset->NoWoodTile
+	    && t == TheMap.Tileset->NoWoodTile ) {
+	MapFixWood( x, y );
+    } else if ( st == TheMap.Tileset->NoWoodTile
+	    && t != TheMap.Tileset->NoWoodTile ) {
+	FixWood( x, y );
+    } else if ( MapWoodChk( x, y ) ) {
+	FixWood( x, y );
+	MapFixWood( x, y );
+    }
+
+    // handle WALLs
+
+#define ISTILEWALL(tile) \
+    (TheMap.Tileset->TileTypeTable[(tile)] == TileTypeHWall	\
+	|| TheMap.Tileset->TileTypeTable[(tile)] == TileTypeOWall)
+
+    if ( ISTILEWALL(st) && !ISTILEWALL(st) )
+	MapFixWall( x, y );
+    else if ( !ISTILEWALL(st) && ISTILEWALL(st) )
+	FixWall( x, y );
+    else if ( MapWallChk( x, y, -1 ) ) {
+	FixWall( x, y );
+	MapFixWall( x, y );
+    }
+}
 
 /**
 **	Reveal the entire map.
@@ -201,10 +210,9 @@ global void RevealMap(void)
 
     for ( ix = 0; ix < TheMap.Width; ix++ ) {
 	for ( iy = 0; iy < TheMap.Height; iy++ ) {
-	    MAPFIELD(ix,iy).Flags |= MapFieldExplored;
-	    if (TheMap.NoFogOfWar) {
-		MAPFIELD(ix,iy).Flags |= MapFieldVisible;
-	    }
+	    TheMap.Fields[ix+iy*TheMap.Width].Flags
+		    |= MapFieldExplored
+			| TheMap.NoFogOfWar ? MapFieldVisible : 0;
 	    MapMarkSeenTile(ix,iy);
 	}
     }
@@ -255,6 +263,7 @@ global void MapCenter(int x,int y)
 **
 **	@param x	X map tile position.
 **	@param y	Y map tile position.
+**
 **	@return		True if water, false otherwise.
 */
 global int WaterOnMap(int tx,int ty)
@@ -314,6 +323,11 @@ global int OrcWallOnMap(int tx,int ty)
 
 /**
 **	Forest on map tile. Checking version.
+**
+**	@param x	X map tile position.
+**	@param y	Y map tile position.
+**
+**	@return		True if forest, false otherwise.
 */
 global int CheckedForestOnMap(int tx,int ty)
 {
@@ -325,6 +339,11 @@ global int CheckedForestOnMap(int tx,int ty)
 
 /**
 **	Forest on map tile.
+**
+**	@param x	X map tile position.
+**	@param y	Y map tile position.
+**
+**	@return		True if forest, false otherwise.
 */
 global int ForestOnMap(int tx,int ty)
 {
@@ -342,6 +361,12 @@ global int ForestOnMap(int tx,int ty)
 
 /**
 **	Can move to this point, applying mask.
+**
+**	@param x	X map tile position.
+**	@param y	Y map tile position.
+**	@param mask	Mask for movement to apply.
+**
+**	@return		True if could be entered, false otherwise.
 */
 global int CheckedCanMoveToMask(int x,int y,int mask)
 {
@@ -355,6 +380,12 @@ global int CheckedCanMoveToMask(int x,int y,int mask)
 #ifndef CanMoveToMask
 /**
 **	Can move to this point, applying mask.
+**
+**	@param x	X map tile position.
+**	@param y	Y map tile position.
+**	@param mask	Mask for movement to apply.
+**
+**	@return		True if could be entered, false otherwise.
 */
 global int CanMoveToMask(int x,int y,int mask)
 {
@@ -376,6 +407,7 @@ global int CanMoveToMask(int x,int y,int mask)
 **	This flags are used to mark the field for this unit.
 **
 **	@param unit	Pointer to unit.
+**
 **	@return		Field flags to be set.
 */
 global unsigned UnitFieldFlags(const Unit* unit)
@@ -418,7 +450,7 @@ global int TypeMovementMask(const UnitType* type)
 	case UnitTypeFly:		// in air
 	    return MapFieldAirUnit;	// already occuppied
 	case UnitTypeNaval:		// on water
-	    if( type->Transporter ) {	
+	    if( type->Transporter ) {
 		return MapFieldLandUnit
 		    | MapFieldSeaUnit
 		    | MapFieldBuilding	// already occuppied
@@ -448,35 +480,76 @@ global int UnitMovementMask(const Unit* unit)
     return TypeMovementMask(unit->Type);
 }
 
-/*----------------------------------------------------------------------------
-*/
-
 /**
 **	Fixes initially the wood and seen tiles.
 */
 global void PreprocessMap(void)
 {
-  unsigned ix, iy;
+    unsigned ix, iy;
+    MapField* mf;
 
-    for ( ix = 0; ix < TheMap.Width; ix++ )
-      for ( iy = 0; iy < TheMap.Height; iy++ )
-        {
-        MAPFIELD( ix, iy ).SeenTile = MAPFIELD( ix, iy ).Tile;
-        }
+    for ( ix = 0; ix < TheMap.Width; ix++ ) {
+	for ( iy = 0; iy < TheMap.Height; iy++ ) {
+	    mf=TheMap.Fields+ix+iy*TheMap.Width;
+	    mf->SeenTile=mf->Tile;
+	}
+    }
 
     // it is required for fixing the wood that all tiles are marked as seen!
-    for ( ix = 0; ix < TheMap.Width; ix++ )
-      for ( iy = 0; iy < TheMap.Height; iy++ )
-        {
-        FixWood( ix, iy );
-        FixWall( ix, iy );
-        }
-};
+    for ( ix = 0; ix < TheMap.Width; ix++ ) {
+	for ( iy = 0; iy < TheMap.Height; iy++ ) {
+	    FixWood( ix, iy );
+	    FixWall( ix, iy );
+	}
+    }
+}
 
+/**
+**	Convert a screen coordinate to map tile.
+**
+**	@param x	X screen coordinate.
+**
+**	@returns	X tile number.
+*/
+global int Screen2MapX(int x)
+{
+    return (((x)-TheUI.MapX)/TileSizeX+MapX);
+}
 
-global int Screen2MapX(int x) { return (((x)-TheUI.MapX)/TileSizeX+MapX); }
-global int Screen2MapY(int x) { return (((x)-TheUI.MapY)/TileSizeY+MapY); }
-global int Map2ScreenX(int x) { return (TheUI.MapX+((x)-MapX)*TileSizeX); }
-global int Map2ScreenY(int x) { return (TheUI.MapY+((x)-MapY)*TileSizeY); }
+/**
+**	Convert a screen coordinate to map tile.
+**
+**	@param y	Y screen coordinate.
+**
+**	@returns	Y tile number.
+*/
+global int Screen2MapY(int y)
+{
+    return (((y)-TheUI.MapY)/TileSizeY+MapY);
+}
+
+/**
+**	Convert a map tile into screen coordinate.
+**
+**	@param x	X tile number.
+**
+**	@returns	X screen coordinate.
+*/
+global int Map2ScreenX(int x)
+{
+    return (TheUI.MapX+((x)-MapX)*TileSizeX);
+}
+
+/**
+**	Convert a map tile into screen coordinate.
+**
+**	@param y	Y tile number.
+**
+**	@returns	Y screen coordinate.
+*/
+global int Map2ScreenY(int y)
+{
+    return (TheUI.MapY+((y)-MapY)*TileSizeY);
+}
 
 //@}
diff --git a/map/map_fog.cpp b/map/map_fog.cpp
index d15d30301..8cf233577 100644
--- a/map/map_fog.cpp
+++ b/map/map_fog.cpp
@@ -191,7 +191,7 @@ global void MapUpdateVisible(void)
     if (TheMap.NoFogOfWar) {
 	for( x=0; x<TheMap.Width; ++x ) {
 	    for( y=0; y<TheMap.Height; y++ ) {
-		if ( MAPVISIBLE(x,y) ) {
+		if ( IsMapFieldVisible(x,y) ) {
 		    MapMarkSeenTile( x,y );
 		}
 	    }
diff --git a/map/map_rock.cpp b/map/map_rock.cpp
index ccd695aa0..2ab9ff89d 100644
--- a/map/map_rock.cpp
+++ b/map/map_rock.cpp
@@ -31,7 +31,7 @@
 --	Declarations
 ----------------------------------------------------------------------------*/
 
- // -1 is hack should be fixed later
+ // FIXME: -1 is hack should be fixed later
 #define FIRST_ROCK_TILE  (TheMap.Tileset->FirstRockTile-1)
 
 /*----------------------------------------------------------------------------
@@ -47,50 +47,71 @@ local const int RockTable[16] = {
 --	Functions
 ----------------------------------------------------------------------------*/
 
-local int RockChk(int x,int y) // used by FixRock and PreprocessMap
+/**
+**	Check if the tile type is rock.
+**
+** 	Used by @see FixRock and @see PreprocessMap
+*/
+local int MapRockChk(int x,int y)
 {
-  if( !INMAP(x,y) ) return 1; // outside considered rock
-  return (TILETYPE(MAPSEENTILE(x,y)) == TileTypeRock);
+    if( x<0 || y<0 || x>=TheMap.Width || y>=TheMap.Height ) {
+	return 1;		// outside considered rock
+    }
+
+    return TheMap.Tileset->TileTypeTable[
+	    TheMap.Fields[(x)+(y)*TheMap.Width].SeenTile
+	] == TileTypeRock;
 }
 
+// FIXME: docu
 local int FixRock(int x,int y) // used by MapRemoveRock and PreprocessMap
 {
-  int tile = 0;
+    int tile;
+    MapField* mf;
 
-  if ( !INMAP(x,y) ) return 0;
-  if ( RockChk(x,y) == 0 ) return 0;
-
-  #define ROCK(xx,yy) (RockChk(xx,yy) != 0)
-  if (ROCK(x  ,y-1)) tile |= 1<<0;
-  if (ROCK(x+1,y  )) tile |= 1<<1;
-  if (ROCK(x  ,y+1)) tile |= 1<<2;
-  if (ROCK(x-1,y  )) tile |= 1<<3;
-
-  tile = RockTable[tile];
-  if (tile == -1)
-    MapRemoveRock(x,y);
-  else
-    {
-    if (tile == RockTable[15])
-      {
-      // Vladi: still to filter tiles w. corner empties -- note: the original
-      // tiles and order are not perfect either. It's a hack but is enough and
-      // looks almost fine.
-      if (RockChk(x+1,y-1) == 0) tile =  7; else
-      if (RockChk(x+1,y+1) == 0) tile = 10; else
-      if (RockChk(x-1,y+1) == 0) tile = 11; else
-      if (RockChk(x-1,y-1) == 0) tile =  4; else
-                                 tile = RockTable[15]; // not required really
-      }
-
-    tile += FIRST_ROCK_TILE;
-    if (MAPFIELD(x,y).SeenTile == tile) return 0;
-    MAPFIELD(x,y).SeenTile =  tile;
+    //	Outside map or no rock.
+    if( x<0 || y<0 || x>=TheMap.Width || y>=TheMap.Height ) {
+	return 0;
     }
-  UpdateMinimapXY(x,y);
-  return 1;
+    if ( !MapRockChk(x,y) ) {
+	return 0;
+    }
+
+#define ROCK(xx,yy) (MapRockChk(xx,yy) != 0)
+    tile = 0;
+    if (ROCK(x  ,y-1)) tile |= 1<<0;
+    if (ROCK(x+1,y  )) tile |= 1<<1;
+    if (ROCK(x  ,y+1)) tile |= 1<<2;
+    if (ROCK(x-1,y  )) tile |= 1<<3;
+
+    tile = RockTable[tile];
+    if (tile == -1) {
+	MapRemoveRock(x,y);
+    } else {
+	if (tile == RockTable[15]) {
+    // Vladi: still to filter tiles w. corner empties -- note: the original
+    // tiles and order are not perfect either. It's a hack but is enough and
+    // looks almost fine.
+	    if (MapRockChk(x+1,y-1) == 0) tile =  7; else
+	    if (MapRockChk(x+1,y+1) == 0) tile = 10; else
+	    if (MapRockChk(x-1,y+1) == 0) tile = 11; else
+	    if (MapRockChk(x-1,y-1) == 0) tile =  4; else
+				tile = RockTable[15]; // not required really
+	}
+
+	tile += FIRST_ROCK_TILE;
+	mf=TheMap.Fields+x+y*TheMap.Width;
+
+	if ( mf->SeenTile == tile) {
+	    return 0;
+	}
+	mf->SeenTile =  tile;
+    }
+    UpdateMinimapXY(x,y);
+    return 1;
 }
 
+// FIXME: docu
 global void MapFixRock(int x,int y)
 {
     // side neighbors
@@ -115,8 +136,12 @@ global void MapRemoveRock(unsigned x,unsigned y)
     mf->Tile=TheMap.Tileset->NoRockTile;
     mf->Flags &= ~(MapFieldRocks|MapFieldUnpassable);
 
-    UpdateMinimapXY(x,y);
-    MustRedraw|=RedrawMaps;
+    UpdateMinimapXY(x,y);		// FIXME: should be done if visible?
+
+    // Must redraw map only if field is visibile
+    if( mf->Flags&MapFieldVisible ) {
+	MustRedraw|=RedrawMaps;
+    }
 }
 
 //@}
diff --git a/map/map_wall.cpp b/map/map_wall.cpp
index 79fe921ff..862378c7c 100644
--- a/map/map_wall.cpp
+++ b/map/map_wall.cpp
@@ -67,22 +67,30 @@ local int WallTable[16] = {
 
 global int MapWallChk(int x,int y,int walltype) // used by FixWall, walltype==-1 for auto
 {
-  if( !INMAP(x,y) ) return 1; // outside considered wall
-  // return !!(MAPFIELD(x,y).Flags & MapFieldForest);
-  if (walltype == -1)
-    return (TILETYPE(MAPSEENTILE(x,y)) == TileTypeHWall ||
-            TILETYPE(MAPSEENTILE(x,y)) == TileTypeOWall );
-  else
-    return (TILETYPE(MAPSEENTILE(x,y)) == walltype);
+    int t;
+
+    if( x<0 || y<0 || x>=TheMap.Width || y>=TheMap.Height ) {
+	return 1;	// Outside considered wall
+    }
+    t=TheMap.Tileset->TileTypeTable[
+	    TheMap.Fields[(x)+(y)*TheMap.Width].SeenTile];
+    if (walltype == -1) {
+	return t == TileTypeHWall || t == TileTypeOWall ;
+    }
+    return t == walltype;
 }
 
 global int FixWall(int x,int y) // used by MapRemoveWall and PreprocessMap
 {
   int tile;
   int walltype;
+  MapField* mf;
 
-  if ( !INMAP(x,y) ) return 0;
-  walltype = TILETYPE(MAPSEENTILE(x,y));
+  if( x<0 || y<0 || x>=TheMap.Width || y>=TheMap.Height ) {
+      return 0;
+  }
+  mf=TheMap.Fields+(x)+(y)*TheMap.Width;
+  walltype = TheMap.Tileset->TileTypeTable[mf->SeenTile];
   if ( walltype != TileTypeHWall && walltype != TileTypeOWall ) return 0;
 
   #define WALL(xx,yy) (MapWallChk(xx,yy,walltype) != 0)
@@ -96,23 +104,23 @@ global int FixWall(int x,int y) // used by MapRemoveWall and PreprocessMap
 
   if (walltype == TileTypeHWall)
      {
-     if (MAPFIELD(x,y).Value < WALL_50HP)
+     if (mf->Value < WALL_50HP)
         tile += TheMap.Tileset->HumanWall50Tile;
       else
         tile += TheMap.Tileset->HumanWall100Tile;
      }
    else
      {
-     if (MAPFIELD(x,y).Value < WALL_50HP)
+     if (mf->Value < WALL_50HP)
         tile += TheMap.Tileset->OrcWall50Tile;
       else
         tile += TheMap.Tileset->OrcWall100Tile;
      }
 
 // FIXME: Johns, Is this correct? Could this function be called under fog of war
-    if (MAPFIELD(x,y).SeenTile == tile)
+    if (mf->SeenTile == tile)
 	return 0;
-    MAPFIELD(x,y).SeenTile =  tile;
+    mf->SeenTile = tile;
 
     UpdateMinimapXY(x,y);
     return 1;
diff --git a/map/map_wood.cpp b/map/map_wood.cpp
index 06fc10d30..1a06e8ca6 100644
--- a/map/map_wood.cpp
+++ b/map/map_wood.cpp
@@ -45,42 +45,62 @@ local int WoodTable[16] = {
 --	Functions
 ----------------------------------------------------------------------------*/
 
-global int MapWoodChk(int x,int y) // used by FixWood
+/**
+**	Check if the tile type is wood.
+**
+** 	Used by @see MapFixWood and @see PreprocessMap
+*/
+local int MapWoodChk(int x,int y)
 {
-  if( !INMAP(x,y) ) return 1; // outside considered wood
-  // return !!(MAPFIELD(x,y).Flags & MapFieldForest);
-  return (TILETYPE(MAPSEENTILE(x,y)) == TileTypeWood);
+    if( x<0 || y<0 || x>=TheMap.Width || y>=TheMap.Height ) {
+	return 1;		// outside considered wood
+    }
+
+    return TheMap.Tileset->TileTypeTable[
+	    TheMap.Fields[(x)+(y)*TheMap.Width].SeenTile
+	] == TileTypeWood;
 }
 
 // FIXME: this function is called to often.
+// FIXME: docu
 global int FixWood(int x,int y) // used by MapRemoveWood2 and PreprocessMap
 {
-  int tile = 0;
+    int tile;
+    MapField* mf;
 
-  if ( !INMAP(x,y) ) return 0;
-  if ( MapWoodChk(x,y) == 0 ) return 0;
-
-  #define WOOD(xx,yy) (MapWoodChk(xx,yy) != 0)
-  if (WOOD(x  ,y-1)) tile |= 1<<0;
-  if (WOOD(x+1,y  )) tile |= 1<<1;
-  if (WOOD(x  ,y+1)) tile |= 1<<2;
-  if (WOOD(x-1,y  )) tile |= 1<<3;
-
-  tile = WoodTable[tile];
-  if (tile == -1)
-    MapRemoveWood(x,y);
-  else
-    {
-    // DON'T work EGCC failure tile += TheMap.Tileset->FirstWoodTile;
-    tile += 0x65;
-    DebugLevel3(__FUNCTION__":%x\n", TheMap.Tileset->FirstWoodTile);
-    if (MAPFIELD(x,y).SeenTile == tile) return 0;
-    MAPFIELD(x,y).SeenTile =  tile;
+    //	Outside map or no wood.
+    if( x<0 || y<0 || x>=TheMap.Width || y>=TheMap.Height ) {
+	return 0;
     }
-  UpdateMinimapXY(x,y);
-  return 1;
+    if ( !MapWoodChk(x,y) ) {
+	return 0;
+    }
+
+    tile = 0;
+#define WOOD(xx,yy) (MapWoodChk(xx,yy) != 0)
+    if (WOOD(x  ,y-1)) tile |= 1<<0;
+    if (WOOD(x+1,y  )) tile |= 1<<1;
+    if (WOOD(x  ,y+1)) tile |= 1<<2;
+    if (WOOD(x-1,y  )) tile |= 1<<3;
+
+    tile = WoodTable[tile];
+    if (tile == -1) {
+	MapRemoveWood(x,y);
+    } else {
+    // DON'T work EGCC failure tile += TheMap.Tileset->FirstWoodTile;
+	tile += 0x65;
+	DebugLevel3(__FUNCTION__":%x\n", TheMap.Tileset->FirstWoodTile);
+	mf=TheMap.Fields+x+y*TheMap.Width;
+	if ( mf->SeenTile == tile) {
+	    return 0;
+	}
+	mf->SeenTile =  tile;
+    }
+    UpdateMinimapXY(x,y);
+    return 1;
 }
 
+// FIXME: docu
 global void MapFixWood(int x,int y)
 {
     // side neighbors
diff --git a/ui/mouse.cpp b/ui/mouse.cpp
index 02e2ffa72..675ff8495 100644
--- a/ui/mouse.cpp
+++ b/ui/mouse.cpp
@@ -521,7 +521,7 @@ global void UIHandleMouseMove(int x,int y)
     //cade: this is forbidden for unexplored and not visible space
     // FIXME: This must done new, moving units, scrolling...
     if( CursorOn==CursorOnMap ) {
-	if( MAPVISIBLE(Screen2MapX(x),Screen2MapY(y)) ) {
+	if( IsMapFieldVisible(Screen2MapX(x),Screen2MapY(y)) ) {
 	    DebugLevel3(__FUNCTION__": %d,%d\n"
 		    ,x-TheUI.MapX+MapX*TileSizeX
 		    ,y-TheUI.MapY+MapY*TileSizeY);
@@ -530,7 +530,7 @@ global void UIHandleMouseMove(int x,int y)
 		    ,y-TheUI.MapY+MapY*TileSizeY);
 	}
     } else if( CursorOn==CursorOnMinimap ) {
-	if( MAPVISIBLE(Minimap2MapX(x),Minimap2MapY(y)) ) {
+	if( IsMapFieldVisible(Minimap2MapX(x),Minimap2MapY(y)) ) {
 	    UnitUnderCursor=UnitOnMapTile(Minimap2MapX(x),Minimap2MapY(y));
 	}
     }
@@ -897,7 +897,7 @@ global void UIHandleButtonDown(int b)
  		if( CanBuildUnitType(Selected[0],CursorBuilding,x,y)
 			// FIXME: vladi: should check all building footprint
 			// but not just MAPEXPLORED(x,y)
-			&& MAPEXPLORED(x,y) ) {
+			&& IsMapFieldExplored(x,y) ) {
 		    PlayGameSound(GameSounds.PlacementSuccess.Sound
 			    ,MaxSampleVolume);
 		    SendCommandBuildBuilding(Selected[0],x,y,CursorBuilding
@@ -1057,7 +1057,7 @@ global void UIHandleButtonUp(int b)
 	    }
             //cade: cannot select unit on invisible space
 	    // FIXME: johns: only complete invisibile units
-            if( MAPVISIBLE(Screen2MapX(CursorX),Screen2MapY(CursorY)) ) {
+            if( IsMapFieldVisible(Screen2MapX(CursorX),Screen2MapY(CursorY)) ) {
 		unit=UnitOnScreen(unit
 		    ,CursorX-TheUI.MapX+MapX*TileSizeX
 		    ,CursorY-TheUI.MapY+MapY*TileSizeY);
diff --git a/unit/unit_draw.cpp b/unit/unit_draw.cpp
index 01633f8ad..c2dd6474a 100644
--- a/unit/unit_draw.cpp
+++ b/unit/unit_draw.cpp
@@ -522,11 +522,11 @@ local void DrawBuilding(Unit* unit)
     // FIXME: johns: under the fog are shown partly.
 
     // FIXME: There is already a check in the main loop UnitVisibile!
-    if ( !MAPEXPLORED( x, y ) ) {
+    if ( !IsMapFieldExplored( x, y ) ) {
 	return;
     }
 
-    if ( !TheMap.NoFogOfWar && !MAPVISIBLE( x, y ) ) {
+    if ( !TheMap.NoFogOfWar && !IsMapFieldVisible( x, y ) ) {
 	frame = unit->SeenFrame;
 	if (frame == 255) {
 	    return;
@@ -535,12 +535,6 @@ local void DrawBuilding(Unit* unit)
 	frame = unit->SeenFrame = unit->Frame;
     }
 
-#if 0
-    if( type->Type==UnitOilPlatformHuman || type->Type==UnitOilPlatformOrc ) {
-	DebugLevel0("%d -> %d\n",unit->Frame,frame);
-    }
-#endif
-
     n_frame = 0;
     if ((frame & 128) == 0 && unit->Rs > 50) {
 	n_frame = 128; // fancy buildings
@@ -579,7 +573,7 @@ local void DrawBuilding(Unit* unit)
 	DrawUnitType(type,frame+n_frame,x,y);
     }
 
-    // FIXME: johns: ugly check here should be removed! vanish could be used
+    // FIXME: johns: ugly check here should be removed! vanish could be used?
     if( unit->Command.Action!=UnitActionDie ) {
 	DrawDecoration(unit,type,x,y);
 	DrawSelectionRectangle(unit,type,x,y);