Search in sources :

Example 1 with Geyser

use of bwem.unit.Geyser in project BWAPI4J by OpenBW.

the class TestListenerBwem method onFrame.

@Override
public void onFrame() {
    try {
        // Send idle workers to mine at the closest mineral patch.
        for (final Worker worker : workers) {
            if (worker.isIdle()) {
                MineralPatch closestMineralPatch = null;
                for (final MineralPatch mineralPatch : bw.getMineralPatches()) {
                    if (closestMineralPatch == null) {
                        closestMineralPatch = mineralPatch;
                    } else {
                        if (mineralPatch.getPosition().getDistance(self.getStartLocation().toPosition()) < closestMineralPatch.getPosition().getDistance(self.getStartLocation().toPosition())) {
                            closestMineralPatch = mineralPatch;
                        }
                    }
                }
                worker.gather(closestMineralPatch);
            }
        }
        /* Train an SCV at every Command Center. */
        {
            if (self.getRace() == Race.Terran) {
                for (final PlayerUnit u : bw.getUnits(self)) {
                    if (u instanceof CommandCenter) {
                        final CommandCenter commandCenter = (CommandCenter) u;
                        if (!commandCenter.isTraining()) {
                            commandCenter.trainWorker();
                        }
                    }
                }
            }
        }
        /* Highlight starting locations and possible base locations. */
        {
            for (final Base base : bwem.getMap().getBases()) {
                final boolean isStartingLocation = base.isStartingLocation();
                final Color highlightColor = isStartingLocation ? Color.GREEN : Color.YELLOW;
                final Position baseLocation = base.getLocation().toPosition();
                final Position resourceDepotSize = UnitType.Terran_Command_Center.tileSize().toPosition();
                if (isOnScreen(baseLocation)) {
                    bw.getMapDrawer().drawBoxMap(baseLocation, baseLocation.add(resourceDepotSize), highlightColor);
                }
                /* Display minerals. */
                for (final Mineral mineral : base.getMinerals()) {
                    if (isOnScreen(mineral.getCenter())) {
                        bw.getMapDrawer().drawLineMap(mineral.getCenter(), base.getCenter(), Color.CYAN);
                    }
                }
                /* Display geysers. */
                for (final Geyser geyser : base.getGeysers()) {
                    if (isOnScreen(geyser.getCenter())) {
                        bw.getMapDrawer().drawLineMap(geyser.getCenter(), base.getCenter(), Color.GREEN);
                    }
                }
            }
        }
        /* Highlight choke points. */
        {
            final int chokePointRadius = 8;
            final Color chokePointColor = Color.RED;
            for (final ChokePoint chokePoint : bwem.getMap().getChokePoints()) {
                final Position center = chokePoint.getCenter().toPosition();
                if (isOnScreen(center)) {
                    bw.getMapDrawer().drawCircleMap(center, chokePointRadius, chokePointColor);
                    bw.getMapDrawer().drawLineMap(center.getX() - chokePointRadius, center.getY(), center.getX() + chokePointRadius, center.getY(), chokePointColor);
                    bw.getMapDrawer().drawLineMap(center.getX(), center.getY() - chokePointRadius, center.getX(), center.getY() + chokePointRadius, chokePointColor);
                }
            }
        }
        /* Highlight workers. */
        {
            for (final Worker worker : workers) {
                final Position tileSize = new TilePosition(worker.tileWidth(), worker.tileHeight()).toPosition();
                final Position topLeft = worker.getPosition().subtract(tileSize.divide(new Position(2, 2)));
                final Position bottomRight = topLeft.add(tileSize);
                if (isOnScreen(topLeft)) {
                    bw.getMapDrawer().drawBoxMap(topLeft, bottomRight, Color.BROWN);
                }
            }
        }
        /* Draw mouse position debug info. */
        {
            final Position screenPosition = bw.getInteractionHandler().getScreenPosition();
            final Position mousePosition = screenPosition.add(bw.getInteractionHandler().getMousePosition());
            final String mouseText = "T:" + mousePosition.toTilePosition().toString() + "\nW:" + mousePosition.toWalkPosition().toString() + "\nP:" + mousePosition.toString();
            bw.getMapDrawer().drawBoxMap(mousePosition.toTilePosition().toPosition(), mousePosition.toTilePosition().toPosition().add(new TilePosition(1, 1).toPosition()), Color.WHITE);
            bw.getMapDrawer().drawTextMap(mousePosition.add(new Position(20, -10)), mouseText);
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
    }
}
Also used : Mineral(bwem.unit.Mineral) TilePosition(org.openbw.bwapi4j.TilePosition) Position(org.openbw.bwapi4j.Position) Color(org.openbw.bwapi4j.type.Color) CommandCenter(org.openbw.bwapi4j.unit.CommandCenter) MineralPatch(org.openbw.bwapi4j.unit.MineralPatch) Geyser(bwem.unit.Geyser) TilePosition(org.openbw.bwapi4j.TilePosition) Worker(org.openbw.bwapi4j.unit.Worker) PlayerUnit(org.openbw.bwapi4j.unit.PlayerUnit)

Example 2 with Geyser

use of bwem.unit.Geyser in project BWAPI4J by OpenBW.

the class AreaInitializerImpl method validateBaseLocation.

@Override
public boolean validateBaseLocation(final AdvancedData mapAdvancedData, final TilePosition location, final List<Mineral> blockingMinerals) {
    final TilePosition dimCC = UnitType.Terran_Command_Center.tileSize();
    blockingMinerals.clear();
    for (int dy = -3; dy < dimCC.getY() + 3; ++dy) for (int dx = -3; dx < dimCC.getX() + 3; ++dx) {
        final TilePosition deltaLocation = location.add(new TilePosition(dx, dy));
        if (mapAdvancedData.getMapData().isValid(deltaLocation)) {
            final Tile deltaTile = mapAdvancedData.getTile(deltaLocation, CheckMode.NO_CHECK);
            final Neutral deltaTileNeutral = deltaTile.getNeutral();
            if (deltaTileNeutral != null) {
                if (deltaTileNeutral instanceof Geyser) {
                    return false;
                } else if (deltaTileNeutral instanceof Mineral) {
                    final Mineral deltaTileMineral = (Mineral) deltaTileNeutral;
                    if (deltaTileMineral.getInitialAmount() <= 8) {
                        blockingMinerals.add(deltaTileMineral);
                    } else {
                        return false;
                    }
                }
            }
        }
    }
    // checks the distance to the bases already created:
    for (final Base base : getBases()) {
        if (BwemExt.roundedDist(base.getLocation(), location) < BwemExt.min_tiles_between_Bases) {
            return false;
        }
    }
    return true;
}
Also used : Mineral(bwem.unit.Mineral) Neutral(bwem.unit.Neutral) Geyser(bwem.unit.Geyser) TilePosition(org.openbw.bwapi4j.TilePosition) Tile(bwem.tile.Tile) MiniTile(bwem.tile.MiniTile) ChokePoint(bwem.ChokePoint) Base(bwem.Base)

Example 3 with Geyser

use of bwem.unit.Geyser in project BWAPI4J by OpenBW.

the class AreaInitializerImpl method createBases.

@Override
public void createBases(final AdvancedData mapAdvancedData) {
    final TilePosition resourceDepotDimensions = UnitType.Terran_Command_Center.tileSize();
    final List<Resource> remainingResources = new ArrayList<>();
    for (final Mineral mineral : getMinerals()) {
        if ((mineral.getInitialAmount() >= 40) && !mineral.isBlocking()) {
            remainingResources.add(mineral);
        }
    }
    for (final Geyser geyser : getGeysers()) {
        if ((geyser.getInitialAmount() >= 300) && !geyser.isBlocking()) {
            remainingResources.add(geyser);
        }
    }
    while (!remainingResources.isEmpty()) {
        // 1) Calculate the SearchBoundingBox (needless to search too far from the remainingResources):
        TilePosition topLeftResources = new TilePosition(Integer.MAX_VALUE, Integer.MAX_VALUE);
        TilePosition bottomRightResources = new TilePosition(Integer.MIN_VALUE, Integer.MIN_VALUE);
        for (final Resource r : remainingResources) {
            final Pair<TilePosition, TilePosition> pair1 = BwemExt.makeBoundingBoxIncludePoint(topLeftResources, bottomRightResources, r.getTopLeft());
            topLeftResources = pair1.getFirst();
            bottomRightResources = pair1.getSecond();
            final Pair<TilePosition, TilePosition> pair2 = BwemExt.makeBoundingBoxIncludePoint(topLeftResources, bottomRightResources, r.getBottomRight());
            topLeftResources = pair2.getFirst();
            bottomRightResources = pair2.getSecond();
        }
        final TilePosition dimensionsBetweenResourceDepotAndResources = new TilePosition(BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES, BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES);
        TilePosition topLeftSearchBoundingBox = topLeftResources.subtract(resourceDepotDimensions).subtract(dimensionsBetweenResourceDepotAndResources);
        TilePosition bottomRightSearchBoundingBox = bottomRightResources.add(new TilePosition(1, 1)).add(dimensionsBetweenResourceDepotAndResources);
        topLeftSearchBoundingBox = BwemExt.makePointFitToBoundingBox(topLeftSearchBoundingBox, getTopLeft(), getBottomRight().subtract(resourceDepotDimensions).add(new TilePosition(1, 1)));
        bottomRightSearchBoundingBox = BwemExt.makePointFitToBoundingBox(bottomRightSearchBoundingBox, getTopLeft(), getBottomRight().subtract(resourceDepotDimensions).add(new TilePosition(1, 1)));
        // 2) Mark the Tiles with their distances from each remaining Resource (Potential Fields >= 0)
        for (final Resource r : remainingResources) for (int dy = -resourceDepotDimensions.getY() - BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; dy < r.getSize().getY() + resourceDepotDimensions.getY() + BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; ++dy) for (int dx = -resourceDepotDimensions.getX() - BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; dx < r.getSize().getX() + resourceDepotDimensions.getX() + BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; ++dx) {
            final TilePosition deltaTilePosition = r.getTopLeft().add(new TilePosition(dx, dy));
            if (mapAdvancedData.getMapData().isValid(deltaTilePosition)) {
                final Tile tile = mapAdvancedData.getTile(deltaTilePosition, CheckMode.NO_CHECK);
                int dist = (BwemExt.distToRectangle(BwemExt.center(deltaTilePosition), r.getTopLeft().toPosition(), r.getSize().toPosition()) + (TilePosition.SIZE_IN_PIXELS / 2)) / TilePosition.SIZE_IN_PIXELS;
                int score = Math.max(BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES + 3 - dist, 0);
                if (r instanceof Geyser) {
                    // somewhat compensates for Geyser alone vs the several minerals
                    score *= 3;
                }
                if (tile.getAreaId().equals(getId())) {
                    // note the additive effect (assume tile.InternalData() is 0 at the beginning)
                    ((TileImpl) tile).setInternalData(((TileImpl) tile).getInternalData() + score);
                }
            }
        }
        // 3) Invalidate the 7 x 7 Tiles around each remaining Resource (Starcraft rule)
        for (final Resource r : remainingResources) for (int dy = -3; dy < r.getSize().getY() + 3; ++dy) for (int dx = -3; dx < r.getSize().getX() + 3; ++dx) {
            final TilePosition deltaTilePosition = r.getTopLeft().add(new TilePosition(dx, dy));
            if (mapAdvancedData.getMapData().isValid(deltaTilePosition)) {
                final Tile tileToUpdate = mapAdvancedData.getTile(deltaTilePosition, CheckMode.NO_CHECK);
                ((TileImpl) tileToUpdate).setInternalData(-1);
            }
        }
        // 4) Search the best location inside the SearchBoundingBox:
        TilePosition bestLocation = null;
        int bestScore = 0;
        final List<Mineral> blockingMinerals = new ArrayList<>();
        for (int y = topLeftSearchBoundingBox.getY(); y <= bottomRightSearchBoundingBox.getY(); ++y) for (int x = topLeftSearchBoundingBox.getX(); x <= bottomRightSearchBoundingBox.getX(); ++x) {
            final int score = computeBaseLocationScore(mapAdvancedData, new TilePosition(x, y));
            if (score > bestScore) {
                if (validateBaseLocation(mapAdvancedData, new TilePosition(x, y), blockingMinerals)) {
                    bestScore = score;
                    bestLocation = new TilePosition(x, y);
                }
            }
        }
        // 5) Clear Tile::m_internalData (required due to our use of Potential Fields: see comments in 2))
        for (Resource r : remainingResources) {
            for (int dy = -resourceDepotDimensions.getY() - BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; dy < r.getSize().getY() + resourceDepotDimensions.getY() + BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; ++dy) for (int dx = -resourceDepotDimensions.getX() - BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; dx < r.getSize().getX() + resourceDepotDimensions.getX() + BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES; ++dx) {
                final TilePosition deltaTilePosition = r.getTopLeft().add(new TilePosition(dx, dy));
                if (mapAdvancedData.getMapData().isValid(deltaTilePosition)) {
                    final Tile tileToUpdate = mapAdvancedData.getTile(deltaTilePosition, CheckMode.NO_CHECK);
                    ((TileImpl) tileToUpdate).setInternalData(0);
                }
            }
        }
        if (bestScore == 0) {
            break;
        }
        // 6) Create a new Base at bestLocation, assign to it the relevant resources and remove them from RemainingResources:
        final List<Resource> assignedResources = new ArrayList<>();
        for (final Resource r : remainingResources) {
            if (BwemExt.distToRectangle(r.getCenter(), bestLocation.toPosition(), resourceDepotDimensions.toPosition()) + 2 <= BwemExt.MAX_TILES_BETWEEN_COMMAND_CENTER_AND_RESOURCES * TilePosition.SIZE_IN_PIXELS) {
                assignedResources.add(r);
            }
        }
        // for (int i = 0; i < remainingResources.size(); ++i) {
        // Resource r = remainingResources.get(i);
        // if (assignedResources.contains(r)) {
        // remainingResources.remove(i--);
        // }
        // }
        remainingResources.removeIf(assignedResources::contains);
        if (assignedResources.isEmpty()) {
            break;
        }
        super.bases.add(new BaseImpl(this, bestLocation, assignedResources, blockingMinerals));
    }
}
Also used : Mineral(bwem.unit.Mineral) TileImpl(bwem.tile.TileImpl) Resource(bwem.unit.Resource) ArrayList(java.util.ArrayList) BaseImpl(bwem.BaseImpl) Tile(bwem.tile.Tile) MiniTile(bwem.tile.MiniTile) ChokePoint(bwem.ChokePoint) Geyser(bwem.unit.Geyser) TilePosition(org.openbw.bwapi4j.TilePosition)

Example 4 with Geyser

use of bwem.unit.Geyser in project BWAPI4J by OpenBW.

the class MapPrinterExample method printMap.

public void printMap(Map theMap) {
    java.util.Map<Integer, Color> mapZoneColor = new HashMap<>();
    for (int y = 0; y < theMap.getData().getMapData().getWalkSize().getY(); ++y) for (int x = 0; x < theMap.getData().getMapData().getWalkSize().getX(); ++x) {
        WalkPosition p = new WalkPosition(x, y);
        MiniTile miniTile = theMap.getData().getMiniTile(p, CheckMode.NO_CHECK);
        Color col;
        if (miniTile.isSea()) {
            if (mapPrinter.showSeaSide && theMap.getData().isSeaWithNonSeaNeighbors(p))
                col = MapPrinter.CustomColor.SEA_SIDE.color();
            else
                col = MapPrinter.CustomColor.SEA.color();
        } else {
            if (mapPrinter.showLakes && miniTile.isLake()) {
                col = MapPrinter.CustomColor.LAKE.color();
            } else {
                if (mapPrinter.showAltitude) {
                    int c = 255 - ((miniTile.getAltitude().intValue() * 255) / theMap.getHighestAltitude().intValue());
                    col = new Color(c, c, c);
                } else {
                    col = MapPrinter.CustomColor.TERRAIN.color();
                }
                if (mapPrinter.showAreas || mapPrinter.showContinents)
                    if (miniTile.getAreaId().intValue() > 0) {
                        Area area = theMap.getArea(miniTile.getAreaId());
                        Color zoneColor = getZoneColor(area, mapZoneColor);
                        int red = zoneColor.getRed() * col.getRed() / 255;
                        int green = zoneColor.getGreen() * col.getGreen() / 255;
                        col = new Color(red, green, 0);
                    } else {
                        col = MapPrinter.CustomColor.TINY_AREA.color();
                    }
            }
        }
        mapPrinter.point(p, col);
    }
    if (mapPrinter.showData)
        for (int y = 0; y < theMap.getData().getMapData().getTileSize().getY(); ++y) for (int x = 0; x < theMap.getData().getMapData().getTileSize().getX(); ++x) {
            int data = ((TileImpl) theMap.getData().getTile(new TilePosition(x, y))).getInternalData();
            int c = (((data / 1) * 1) % 256);
            Color col = new Color(c, c, c);
            WalkPosition origin = (new TilePosition(x, y)).toWalkPosition();
            mapPrinter.rectangle(origin, origin.add(new WalkPosition(3, 3)), col, MapPrinter.fill_t.fill);
        }
    if (mapPrinter.showUnbuildable)
        for (int y = 0; y < theMap.getData().getMapData().getTileSize().getY(); ++y) for (int x = 0; x < theMap.getData().getMapData().getTileSize().getX(); ++x) if (!theMap.getData().getTile(new TilePosition(x, y)).isBuildable()) {
            WalkPosition origin = (new TilePosition(x, y)).toWalkPosition();
            mapPrinter.rectangle(origin.add(new WalkPosition(1, 1)), origin.add(new WalkPosition(2, 2)), MapPrinter.CustomColor.UNBUILDABLE.color());
        }
    if (mapPrinter.showGroundHeight)
        for (int y = 0; y < theMap.getData().getMapData().getTileSize().getY(); ++y) for (int x = 0; x < theMap.getData().getMapData().getTileSize().getX(); ++x) {
            Tile.GroundHeight groundHeight = theMap.getData().getTile(new TilePosition(x, y)).getGroundHeight();
            if (groundHeight.intValue() >= Tile.GroundHeight.HIGH_GROUND.intValue())
                for (int dy = 0; dy < 4; ++dy) for (int dx = 0; dx < 4; ++dx) {
                    WalkPosition p = (new TilePosition(x, y).toWalkPosition()).add(new WalkPosition(dx, dy));
                    if (// groundHeight is usefull only for walkable miniTiles
                    theMap.getData().getMiniTile(p, CheckMode.NO_CHECK).isWalkable())
                        if (((dx + dy) & (groundHeight == Tile.GroundHeight.HIGH_GROUND ? 1 : 3)) != 0)
                            mapPrinter.point(p, MapPrinter.CustomColor.HIGHER_GROUND.color());
                }
        }
    if (mapPrinter.showAssignedResources)
        for (Area area : theMap.getAreas()) for (Base base : area.getBases()) {
            for (Mineral m : base.getMinerals()) mapPrinter.line(base.getCenter().toWalkPosition(), m.getCenter().toWalkPosition(), MapPrinter.CustomColor.BASES.color());
            for (Geyser g : base.getGeysers()) mapPrinter.line(base.getCenter().toWalkPosition(), g.getCenter().toWalkPosition(), MapPrinter.CustomColor.BASES.color());
        }
    if (mapPrinter.showGeysers)
        for (Geyser g : theMap.getNeutralData().getGeysers()) printNeutral(theMap, g, MapPrinter.CustomColor.GEYSERS.color());
    if (mapPrinter.showMinerals)
        for (Mineral m : theMap.getNeutralData().getMinerals()) printNeutral(theMap, m, MapPrinter.CustomColor.MINERALS.color());
    if (mapPrinter.showStaticBuildings)
        for (StaticBuilding s : theMap.getNeutralData().getStaticBuildings()) printNeutral(theMap, s, MapPrinter.CustomColor.STATIC_BUILDINGS.color());
    if (mapPrinter.showStartingLocations)
        for (TilePosition t : theMap.getData().getMapData().getStartingLocations()) {
            WalkPosition origin = t.toWalkPosition();
            // same size for other races
            WalkPosition size = UnitType.Terran_Command_Center.tileSize().toWalkPosition();
            mapPrinter.rectangle(origin, origin.add(size).subtract(new WalkPosition(1, 1)), MapPrinter.CustomColor.STARTING_LOCATIONS.color(), MapPrinter.fill_t.fill);
        }
    if (mapPrinter.showBases)
        for (Area area : theMap.getAreas()) {
            for (Base base : area.getBases()) {
                WalkPosition origin = base.getLocation().toWalkPosition();
                // same size for other races
                WalkPosition size = UnitType.Terran_Command_Center.tileSize().toWalkPosition();
                MapPrinter.dashed_t dashMode = base.getBlockingMinerals().isEmpty() ? MapPrinter.dashed_t.not_dashed : MapPrinter.dashed_t.dashed;
                mapPrinter.rectangle(origin, origin.add(size).subtract(new WalkPosition(1, 1)), MapPrinter.CustomColor.BASES.color(), MapPrinter.fill_t.do_not_fill, dashMode);
            }
        }
    if (mapPrinter.showChokePoints) {
        for (MutablePair<MutablePair<AreaId, AreaId>, WalkPosition> f : theMap.getRawFrontier()) mapPrinter.point(f.getRight(), mapPrinter.showAreas ? MapPrinter.CustomColor.CHOKE_POINTS_SHOW_AREAS.color() : MapPrinter.CustomColor.CHOKE_POINTS_SHOW_CONTINENTS.color());
        for (Area area : theMap.getAreas()) for (ChokePoint cp : area.getChokePoints()) {
            ChokePoint.Node[] nodes = { ChokePoint.Node.END1, ChokePoint.Node.END2 };
            for (ChokePoint.Node n : nodes) mapPrinter.square(cp.getNodePosition(n), 1, new Color(255, 0, 255), MapPrinter.fill_t.fill);
            mapPrinter.square(cp.getCenter(), 1, new Color(0, 0, 255), MapPrinter.fill_t.fill);
        }
    }
    try {
        mapPrinter.writeImageToFile(Paths.get("map.png"), "png");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
Also used : TileImpl(bwem.tile.TileImpl) Mineral(bwem.unit.Mineral) StaticBuilding(bwem.unit.StaticBuilding) HashMap(java.util.HashMap) MiniTile(bwem.tile.MiniTile) Tile(bwem.tile.Tile) MiniTile(bwem.tile.MiniTile) IOException(java.io.IOException) ChokePoint(bwem.ChokePoint) Base(bwem.Base) MutablePair(org.apache.commons.lang3.tuple.MutablePair) Area(bwem.area.Area) Geyser(bwem.unit.Geyser) TilePosition(org.openbw.bwapi4j.TilePosition) WalkPosition(org.openbw.bwapi4j.WalkPosition) ChokePoint(bwem.ChokePoint)

Aggregations

Geyser (bwem.unit.Geyser)4 Mineral (bwem.unit.Mineral)4 TilePosition (org.openbw.bwapi4j.TilePosition)4 ChokePoint (bwem.ChokePoint)3 MiniTile (bwem.tile.MiniTile)3 Tile (bwem.tile.Tile)3 Base (bwem.Base)2 TileImpl (bwem.tile.TileImpl)2 BaseImpl (bwem.BaseImpl)1 Area (bwem.area.Area)1 Neutral (bwem.unit.Neutral)1 Resource (bwem.unit.Resource)1 StaticBuilding (bwem.unit.StaticBuilding)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 MutablePair (org.apache.commons.lang3.tuple.MutablePair)1 Position (org.openbw.bwapi4j.Position)1 WalkPosition (org.openbw.bwapi4j.WalkPosition)1 Color (org.openbw.bwapi4j.type.Color)1