IHex smokeHex = game.getBoard().getHex(smokeCoords);
    private void resolveSmoke() {        IBoard board = game.getBoard();        int width = board.getWidth();        int height = board.getHeight();        int windDir = game.getWindDirection();        int windStr = game.getWindStrength();        Vector SmokeToAdd = new Vector();        class SmokeDrift { // hold the hex and level of the smoke cloud            public Coords coords;            public int size;            public SmokeDrift(Coords c, int s) {                coords = c;                size = s;            }            public SmokeDrift(SmokeDrift sd) {                sd.coords = coords;                sd.size = size;            }        }        // Cycle through all hexes, checking for smoke, IF the wind is higher than calm! Calm means no drift!        if(windStr > 0) {            debugTime("resolve smoke 1", true);            for (int currentXCoord = 0; currentXCoord < width; currentXCoord++ ) {                for (int currentYCoord = 0; currentYCoord < height; currentYCoord++) {                    Coords currentCoords = new Coords(currentXCoord, currentYCoord);                    IHex currentHex = board.getHex(currentXCoord, currentYCoord);                    // check for existence of smoke, then add it to the vector...if the wind is not Calm!                    if (currentHex.containsTerrain(Terrains.SMOKE)){                        int smokeLevel = currentHex.terrainLevel(Terrains.SMOKE);                        Coords smokeCoords = driftAddSmoke(currentXCoord, currentYCoord, windDir, windStr);                        //                        System.out.println(currentCoords.toString() + " to " + smokeCoords.toString());                        IHex smokeHex = game.getBoard().getHex(smokeCoords);                        if( board.contains(smokeCoords)) { // don't add it to the vector if it's not on board!                            SmokeToAdd.addElement(new SmokeDrift(new Coords(smokeCoords), smokeLevel));                        }                        else {                            // report that the smoke has blown off the map                            Report r = new Report(5230, Report.PUBLIC);                            r.add(currentCoords.getBoardNum());                            vPhaseReport.addElement(r);                        }                        currentHex.removeTerrain(Terrains.SMOKE);                        server.sendChangedHex(currentCoords);                    }                }  // end the loop through Y coordinates            }  // end the loop through X coordinates            debugTime("resolve smoke 1 end, resolve smoke 2 begin", true);            // Cycle through the vector and add the drifted smoke            for (int sta = 0; sta < SmokeToAdd.size(); sta++ ) {                SmokeDrift drift = (SmokeDrift)SmokeToAdd.elementAt(sta);                Coords smokeCoords = drift.coords;                int smokeSize = drift.size;                IHex smokeHex = game.getBoard().getHex(smokeCoords);                smokeHex.addTerrain(Terrains.getTerrainFactory().createTerrain(Terrains.SMOKE, smokeSize));                server.sendChangedHex(smokeCoords);            }            debugTime("resolve smoke 2 end, resolve smoke 3 begin", true);            // Cycle through the vector again and dissipate the smoke, then reporting it            for (int dis = 0; dis < SmokeToAdd.size(); dis++ ) {                SmokeDrift drift = (SmokeDrift)SmokeToAdd.elementAt(dis);                Coords smokeCoords = drift.coords;                int smokeSize = drift.size;                IHex smokeHex = game.getBoard().getHex(smokeCoords);                int roll = Compute.d6(2);                boolean smokeDis = driftSmokeDissipate(smokeHex, roll, smokeSize, windStr);                driftSmokeReport(smokeCoords, smokeSize, smokeDis);                server.sendChangedHex(smokeCoords);            }            debugTime("resolve smoke 3 end", false);        } // end smoke resolution    }