/** ** Marks seen tile -- used mainly for the Fog Of War ** ** @param mf MapField-position. */ void CMap::MarkSeenTile(CMapField &mf) { const unsigned int tile = mf.getGraphicTile(); const unsigned int seentile = mf.playerInfo.SeenTile; // Nothing changed? Seeing already the correct tile. if (tile == seentile) { return; } mf.playerInfo.SeenTile = tile; #ifdef MINIMAP_UPDATE //rb - GRRRRRRRRRRRR const unsigned int index = &mf - Map.Fields; const int y = index / Info.MapWidth; const int x = index - (y * Info.MapWidth); const Vec2i pos = {x, y} #endif if (this->Tileset->TileTypeTable.empty() == false) { #ifndef MINIMAP_UPDATE //rb - GRRRRRRRRRRRR const unsigned int index = &mf - Map.Fields; const int y = index / Info.MapWidth; const int x = index - (y * Info.MapWidth); const Vec2i pos(x, y); #endif // Handle wood changes. FIXME: check if for growing wood correct? if (tile == this->Tileset->getRemovedTreeTile()) { FixNeighbors(MapFieldForest, 1, pos); } else if (seentile == this->Tileset->getRemovedTreeTile()) { FixTile(MapFieldForest, 1, pos); } else if (mf.ForestOnMap()) { FixTile(MapFieldForest, 1, pos); FixNeighbors(MapFieldForest, 1, pos); // Handle rock changes. } else if (tile == Tileset->getRemovedRockTile()) { FixNeighbors(MapFieldRocks, 1, pos); } else if (seentile == Tileset->getRemovedRockTile()) { FixTile(MapFieldRocks, 1, pos); } else if (mf.RockOnMap()) { FixTile(MapFieldRocks, 1, pos); FixNeighbors(MapFieldRocks, 1, pos); // Handle Walls changes. } else if (this->Tileset->isAWallTile(tile) || this->Tileset->isAWallTile(seentile)) { MapFixSeenWallTile(pos); MapFixSeenWallNeighbors(pos); } } #ifdef MINIMAP_UPDATE UI.Minimap.UpdateXY(pos); #endif }
/** ** Regenerate forest. ** ** @param pos Map tile pos */ void CMap::RegenerateForestTile(const Vec2i &pos) { Assert(Map.Info.IsPointOnMap(pos)); CMapField &mf = *this->Field(pos); if (mf.getGraphicTile() != this->Tileset->getRemovedTreeTile()) { return; } // Increment each value of no wood. // If grown up, place new wood. // FIXME: a better looking result would be fine // Allow general updates to any tiletype that regrows const unsigned int occupedFlag = (MapFieldWall | MapFieldUnpassable | MapFieldLandUnit | MapFieldBuilding); ++mf.Value; if (mf.Value < ForestRegeneration) { return; } mf.Value = ForestRegeneration; if ((mf.Flags & occupedFlag) || pos.y == 0) { return; } const Vec2i offset(0, -1); CMapField &topMf = *(&mf - this->Info.MapWidth); if (topMf.getGraphicTile() == this->Tileset->getRemovedTreeTile() && topMf.Value >= ForestRegeneration && !(topMf.Flags & occupedFlag)) { DebugPrint("Real place wood\n"); topMf.setTileIndex(*Map.Tileset, Map.Tileset->getTopOneTreeTile(), 0); topMf.setGraphicTile(Map.Tileset->getTopOneTreeTile()); topMf.playerInfo.SeenTile = topMf.getGraphicTile(); topMf.Value = 0; topMf.Flags |= MapFieldForest | MapFieldUnpassable; UI.Minimap.UpdateSeenXY(pos + offset); UI.Minimap.UpdateXY(pos + offset); mf.setTileIndex(*Map.Tileset, Map.Tileset->getBottomOneTreeTile(), 0); mf.setGraphicTile(Map.Tileset->getBottomOneTreeTile()); mf.playerInfo.SeenTile = mf.getGraphicTile(); mf.Value = 0; mf.Flags |= MapFieldForest | MapFieldUnpassable; UI.Minimap.UpdateSeenXY(pos); UI.Minimap.UpdateXY(pos); if (mf.playerInfo.IsTeamVisible(*ThisPlayer)) { MarkSeenTile(mf); } if (Map.Field(pos + offset)->playerInfo.IsTeamVisible(*ThisPlayer)) { MarkSeenTile(topMf); } FixNeighbors(MapFieldForest, 0, pos + offset); FixNeighbors(MapFieldForest, 0, pos); } }
/** ** Remove wood from the map. ** ** @param type TileType to clear ** @param pos Map tile-position. */ void CMap::ClearTile(unsigned short type, const Vec2i &pos) { int removedtile; int flags; unsigned int index = getIndex(pos); CMapField &mf = *this->Field(index); // Select Table to lookup switch (type) { case MapFieldForest: removedtile = this->Tileset.RemovedTree; flags = (MapFieldForest | MapFieldUnpassable); break; case MapFieldRocks: removedtile = this->Tileset.RemovedRock; flags = (MapFieldRocks | MapFieldUnpassable); break; default: removedtile = flags = 0; } mf.Tile = removedtile; mf.Flags &= ~flags; mf.Value = 0; UI.Minimap.UpdateXY(pos); FixNeighbors(type, 0, pos); //maybe isExplored if (IsTileVisible(*ThisPlayer, index) > 0) { UI.Minimap.UpdateSeenXY(pos); MarkSeenTile(pos); } }
/// Remove rock from the map. void CMap::ClearRockTile(const Vec2i &pos) { CMapField &mf = *this->Field(pos); mf.setGraphicTile(this->Tileset->getRemovedRockTile()); mf.Flags &= ~(MapFieldRocks | MapFieldUnpassable); mf.Value = 0; UI.Minimap.UpdateXY(pos); FixNeighbors(MapFieldRocks, 0, pos); //maybe isExplored if (mf.playerInfo.IsExplored(*ThisPlayer)) { UI.Minimap.UpdateSeenXY(pos); MarkSeenTile(mf); } }
/** ** Marks seen tile -- used mainly for the Fog Of War ** ** @param x Map X tile-position. ** @param y Map Y tile-position. */ void CMap::MarkSeenTile(const unsigned int index) { CMapField &mf = *this->Field(index); const int tile = mf.Tile; const int seentile = mf.SeenTile; // // Nothing changed? Seeing already the correct tile. // if (tile == seentile) { return; } mf.SeenTile = tile; #ifdef MINIMAP_UPDATE //rb - GRRRRRRRRRRRR const int y = index / Info.MapWidth; const int x = index - (y * Info.MapWidth); const Vec2i pos = {x, y} #endif if (this->Tileset.TileTypeTable) { #ifndef MINIMAP_UPDATE //rb - GRRRRRRRRRRRR const int y = index / Info.MapWidth; const int x = index - (y * Info.MapWidth); const Vec2i pos(x, y); #endif // Handle wood changes. FIXME: check if for growing wood correct? if (seentile != this->Tileset.RemovedTree && tile == this->Tileset.RemovedTree) { FixNeighbors(MapFieldForest, 1, pos); } else if (seentile == this->Tileset.RemovedTree && tile != this->Tileset.RemovedTree) { FixTile(MapFieldForest, 1, pos); } else if (ForestOnMap(index)) { FixTile(MapFieldForest, 1, pos); FixNeighbors(MapFieldForest, 1, pos); // Handle rock changes. } else if (seentile != this->Tileset.RemovedRock && tile == Map.Tileset.RemovedRock) { FixNeighbors(MapFieldRocks, 1, pos); } else if (seentile == this->Tileset.RemovedRock && tile != Map.Tileset.RemovedRock) { FixTile(MapFieldRocks, 1, pos); } else if (RockOnMap(index)) { FixTile(MapFieldRocks, 1, pos); FixNeighbors(MapFieldRocks, 1, pos); // Handle Walls changes. } else if (this->Tileset.TileTypeTable[tile] == TileTypeHumanWall || this->Tileset.TileTypeTable[tile] == TileTypeOrcWall || this->Tileset.TileTypeTable[seentile] == TileTypeHumanWall || this->Tileset.TileTypeTable[seentile] == TileTypeOrcWall) { MapFixSeenWallTile(pos); MapFixSeenWallNeighbors(pos); } } #ifdef MINIMAP_UPDATE UI.Minimap.UpdateXY(pos); #endif }