/** ** 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); } }
/** ** Can a unit of unit-type be placed at this point. ** ** @param type unit-type to be checked. ** @param pos map tile position. ** ** @return True if could be entered, false otherwise. */ bool UnitTypeCanBeAt(const CUnitType &type, const Vec2i &pos) { const int mask = type.MovementMask; unsigned int index = pos.y * Map.Info.MapWidth; for (int addy = 0; addy < type.TileHeight; ++addy) { for (int addx = 0; addx < type.TileWidth; ++addx) { if (Map.Info.IsPointOnMap(pos.x + addx, pos.y + addy) == false || Map.Field(pos.x + addx + index)->CheckMask(mask) == true) { return false; } } index += Map.Info.MapWidth; } return true; }
/** ** Fixes initially the wood and seen tiles. */ void PreprocessMap() { for (int ix = 0; ix < Map.Info.MapWidth; ++ix) { for (int iy = 0; iy < Map.Info.MapHeight; ++iy) { CMapField *mf = Map.Field(ix, iy); mf->SeenTile = mf->Tile; } } // it is required for fixing the wood that all tiles are marked as seen! if (Map.Tileset.TileTypeTable) { Vec2i pos; for (pos.x = 0; pos.x < Map.Info.MapWidth; ++pos.x) { for (pos.y = 0; pos.y < Map.Info.MapHeight; ++pos.y) { MapFixWallTile(pos); MapFixSeenWallTile(pos); } } } }
/** ** Fixes initially the wood and seen tiles. */ void PreprocessMap() { for (int ix = 0; ix < Map.Info.MapWidth; ++ix) { for (int iy = 0; iy < Map.Info.MapHeight; ++iy) { CMapField &mf = *Map.Field(ix, iy); mf.playerInfo.SeenTile = mf.getGraphicTile(); } } // it is required for fixing the wood that all tiles are marked as seen! if (Map.Tileset->TileTypeTable.empty() == false) { Vec2i pos; for (pos.x = 0; pos.x < Map.Info.MapWidth; ++pos.x) { for (pos.y = 0; pos.y < Map.Info.MapHeight; ++pos.y) { MapFixWallTile(pos); MapFixSeenWallTile(pos); } } } }