public boolean isLocationProhibited(Coords c, int currElevation) { IHex hex = game.getBoard().getHex(c); if (hex.containsTerrain(Terrains.IMPASSABLE)) { return true; if (hex.containsTerrain(Terrains.SPACE) && doomedInSpace()) { return true; if ((hex.containsTerrain(Terrains.PAVEMENT) || hex.containsTerrain(Terrains.ROAD)) && (!hex.containsTerrain(Terrains.BUILDING) && !hex.containsTerrain(Terrains.RUBBLE))){ return true; if ((hex.terrainLevel(Terrains.BRIDGE_ELEV) == currElevation) && hex.containsTerrain(Terrains.BRIDGE)) { return true; if (hex.containsTerrain(Terrains.WATER) && (currElevation == 0)) { return true; case TRACKED: if (!isSuperHeavy()) { return (hex.terrainLevel(Terrains.WOODS) > 1) || ((hex.terrainLevel(Terrains.WATER) > 0) && !hex.containsTerrain(Terrains.ICE) && !hasFlotationHull && !isAmphibious) || hex.containsTerrain(Terrains.JUNGLE) || (hex.terrainLevel(Terrains.MAGMA) > 1)
if((hex.terrainsPresent() == 0) || (hex.containsTerrain(Terrains.WATER) && (hex.depth() == 0))) { hex.addTerrain(tf.createTerrain(Terrains.MUD, 1)); if(hex.containsTerrain(Terrains.WATER)) { hex.removeTerrain(Terrains.WATER); if(hex.containsTerrain(Terrains.WATER) && !hex.containsTerrain(Terrains.RAPIDS) && (hex.depth() > 0)) { hex.addTerrain(tf.createTerrain(Terrains.RAPIDS, 1)); else if(!hex.containsTerrain(Terrains.BUILDING) && !hex.containsTerrain(Terrains.PAVEMENT) && !hex.containsTerrain(Terrains.ROAD)) { hex.addTerrain(tf.createTerrain(Terrains.MUD, 1)); if(hex.containsTerrain(Terrains.WATER)) { hex.removeTerrain(Terrains.WATER); if(hex.containsTerrain(Terrains.WATER) && !(hex.terrainLevel(Terrains.RAPIDS) > 1) && (hex.depth() > 0)) { hex.addTerrain(tf.createTerrain(Terrains.RAPIDS, 2)); else if(hex.containsTerrain(Terrains.WATER)) { hex.addTerrain(tf.createTerrain(Terrains.SWAMP, 1)); hex.removeTerrain(Terrains.WATER); else if(!hex.containsTerrain(Terrains.BUILDING) && !hex.containsTerrain(Terrains.PAVEMENT) && !hex.containsTerrain(Terrains.ROAD)) { hex.addTerrain(tf.createTerrain(Terrains.MUD, 1)); && hex.containsTerrain(Terrains.WATER) && (hex.depth() > 0)) {
public IBoard implantOldBoard(IGame game, int west, int north, int east, int south) { IBoard oldBoard = game.getBoard(); for (int x = 0; x < oldBoard.getWidth(); x++) { for (int y = 0; y < oldBoard.getHeight(); y++) { int newX = x+west; int newY = y+north; if (oldBoard.contains(x, y) && board.contains(newX, newY)) { IHex oldHex = oldBoard.getHex(x, y); IHex hex = board.getHex(newX, newY); hex.removeAllTerrains(); hex.setLevel(oldHex.getLevel()); int terrainTypes[] = oldHex.getTerrainTypes(); for (int i = 0; i < terrainTypes.length; i++) { int terrainID = terrainTypes[i]; if (!hex.containsTerrain(terrainID) && oldHex.containsTerrain(terrainID)) { hex.addTerrain(oldHex.getTerrain(terrainID)); } } hex.setTheme(oldHex.getTheme()); board.setHex(newX, newY, hex); board.resetStoredElevation(); } } } return board; }
/** * @param hex * @return true if it is reasonable to build on this hex */ private boolean isHexBuildable(IHex hex) { if (hex.containsTerrain(Terrains.WATER) || hex.containsTerrain(Terrains.IMPASSABLE) || hex.containsTerrain(Terrains.MAGMA) || hex.containsTerrain(Terrains.SWAMP)) { return false; // uneconomic to build here } if (hex.getLevel() >= 4) { return false; // don't build on mountaintops (aesthetics) } return true; }
public int elevationOccupied(IHex hex, int elevation) { if (hex == null) { return 0; } if ((movementMode == EntityMovementMode.VTOL) || (movementMode == EntityMovementMode.WIGE)) { return hex.surface() + elevation; } else if (((movementMode == EntityMovementMode.HOVER) || (movementMode == EntityMovementMode.NAVAL) || (movementMode == EntityMovementMode.HYDROFOIL) || hex.containsTerrain(Terrains.ICE)) && hex.containsTerrain(Terrains.WATER)) { return hex.surface(); } else { return hex.floor(); } }
private void paintHeight(Graphics g, IHex h, int x, int y) { if (heightDisplayMode == SHOW_NO_HEIGHT) { return; } if (zoom > 2) { int baseX = (x * (hexSide[zoom] + hexSideBySin30[zoom])) + leftMargin; int baseY = (((2 * y) + 1 + (x % 2)) * hexSideByCos30[zoom]) + topMargin; g.setColor(Color.white); int height = 0; if ((h.getTerrain(Terrains.BUILDING) != null) && (heightDisplayMode == SHOW_BUILDING_HEIGHT)) { height = h.ceiling(); } else if (heightDisplayMode == SHOW_GROUND_HEIGHT) { height = h.floor(); } else if (heightDisplayMode == SHOW_TOTAL_HEIGHT) { height = ((h.getTerrain(Terrains.BUILDING) != null) || (h .getTerrain(Terrains.FUEL_TANK) != null)) ? h.ceiling() : h.floor(); } if (height != 0) { g.drawString(height + "", baseX + 5, baseY + 5); //$NON-NLS-1$ } } }
if ((com.getLevel() != ITerrain.WILDCARD) && (org.getLevel() != com.getLevel())) { return 0; if ((com.getTheme() != null) && !com.getTheme().equalsIgnoreCase(org.getTheme())) { return 0.0; if (org.terrainsPresent() < com.terrainsPresent()) return 0.0; int cTerrainTypes[] = com.getTerrainTypes(); for (int i = 0; i < cTerrainTypes.length; i++) { int cTerrType = cTerrainTypes[i]; ITerrain cTerr = com.getTerrain(cTerrType); ITerrain oTerr = org.getTerrain(cTerrType); if (cTerr == null) { continue;
/** * Apply the current Hex to the Board at the specified location. */ public void addToHex(Coords c) { if (board.contains(c)) { IHex newHex = curHex.duplicate(); IHex oldHex = board.getHex(c); newHex.setLevel(oldHex.getLevel()); int terrainTypes[] = oldHex.getTerrainTypes(); for (int i = 0; i < terrainTypes.length; i++) { int terrainID = terrainTypes[i]; if (!newHex.containsTerrain(terrainID) && oldHex.containsTerrain(terrainID)) { newHex.addTerrain(oldHex.getTerrain(terrainID)); } } board.resetStoredElevation(); board.setHex(c, newHex); } }
for (n = 0; n < hexSet.length; n++) { field = hexSet[n]; if (field.containsTerrain(Terrains.SWAMP)) { field.removeTerrain(Terrains.SWAMP); // any swamps are dried if ((field.terrainsPresent() == 0) && (Compute.randomInt(100) < 30)) { field.addTerrain(f.createTerrain(Terrains.ROUGH, 1)); level = field.terrainLevel(Terrains.WATER); if (level != ITerrain.LEVEL_NONE) { newlevel = level - severity; field.removeTerrain(Terrains.WATER); if (newlevel == 0) { field.addTerrain(f.createTerrain(Terrains.SWAMP, 1)); } else if (newlevel < 0) { field.addTerrain(f.createTerrain(Terrains.ROUGH, 1)); } else { field.addTerrain(f.createTerrain(Terrains.WATER, newlevel)); field.setLevel(field.getLevel() - newlevel);
new Object[] { mcoords.getBoardNum(), mhex.getLevel() })); txt.append("<br>"); //$NON-NLS-1$ int terrainTypes[] = mhex.getTerrainTypes(); for (int i = 0; i < terrainTypes.length; i++) { int terType = terrainTypes[i]; if (mhex.containsTerrain(terType)) { int tf = mhex.getTerrain(terType).getTerrainFactor(); int ttl = mhex.getTerrain(terType).getLevel(); String name = Terrains.getDisplayName(terType, ttl); if (tf > 0) { if (mhex.containsTerrain(Terrains.FUEL_TANK)) { Building bldg = game.getBoard().getBuildingAt(mcoords); txt.append("<TABLE BORDER=0 BGCOLOR=#999999 width=100%><TR><TD><FONT color=\"black\">"); //$NON-NLS-1$ txt.append(Messages.getString("BoardView1.Tooltip.Bridge", new Object[] { //$NON-NLS-1$ mhex.terrainLevel(Terrains.FUEL_TANK_ELEV), bldg.toString(), bldg.getCurrentCF(mcoords), if (mhex.containsTerrain(Terrains.BUILDING)) { Building bldg = game.getBoard().getBuildingAt(mcoords); txt.append("<TABLE BORDER=0 BGCOLOR=#CCCC99 width=100%><TR><TD><FONT color=\"black\">"); //$NON-NLS-1$ txt.append(Messages.getString("BoardView1.Tooltip.Building", new Object[] { //$NON-NLS-1$ mhex.terrainLevel(Terrains.BLDG_ELEV), bldg.toString(), bldg.getCurrentCF(mcoords),
if (destHex.containsTerrain(Terrains.IMPASSABLE)) { final int srcAlt = srcEl + srcHex.getLevel(); final int destAlt = elevation + destHex.getLevel(); .getHex(entity.getPosition()).surface()) - hex.surface(); && (maxElevation < hex.terrainLevel(Terrains.BLDG_ELEV))) { if ((elevation < hex.terrainLevel(Terrains.BLDG_ELEV)) && (bld.getArmor(dest) > 0) && !(entity instanceof Infantry)) { if ((elevation < hex.terrainLevel(Terrains.BLDG_ELEV)) && (bld.getBldgClass() == Building.GUN_EMPLACEMENT) && !(entity instanceof Infantry)) { int maxDown = entity.getMaxElevationDown(srcAlt); if (movementMode == EntityMovementMode.WIGE && (srcEl == 0 || (srcHex.containsTerrain(Terrains.BLDG_ELEV) && (srcHex.terrainLevel(Terrains.BLDG_ELEV) >= srcEl)))) { maxDown = entity.getMaxElevationChange(); && (nMove != EntityMovementMode.WIGE) && !entity.hasWorkingMisc(MiscType.F_FULLY_AMPHIBIOUS) && (destHex.terrainLevel(Terrains.WATER) > 0) && !(destHex.containsTerrain(Terrains.ICE) && (elevation >= 0)) && !dest.equals(entity.getPosition())
if (currentHex.containsTerrain(Terrains.FIRE)) { if(currentHex.terrainLevel(Terrains.FIRE) == Terrains.FIRE_LVL_NORMAL) { if(conditions.putOutFire()) { } else if (currentHex.terrainLevel(Terrains.FIRE) == Terrains.FIRE_LVL_INFERNO) { currentHex.removeTerrain(Terrains.FIRE); currentHex.addTerrain(tf.createTerrain(Terrains.FIRE,1)); server.getHexUpdateSet().add(currentCoords); } else if (currentHex.terrainLevel(Terrains.FIRE) == Terrains.FIRE_LVL_INFERNO_BOMB) { if (currentHex.getFireTurn() > 30) { server.removeFire(currentCoords, "inferno bomb burning out"); if(ice && !currentHex.containsTerrain(Terrains.ICE) && currentHex.containsTerrain(Terrains.WATER)) { currentHex.addTerrain(tf.createTerrain(Terrains.ICE, 1)); server.getHexUpdateSet().add(currentCoords); && !currentHex.containsTerrain(Terrains.SNOW) && !(currentHex.containsTerrain(Terrains.WATER) && !currentHex.containsTerrain(Terrains.ICE)) && !currentHex.containsTerrain(Terrains.MAGMA)) { currentHex.addTerrain(tf.createTerrain(Terrains.SNOW, 1));
/** * Helper function that calculates the effective elevation for a unit standing there. * @param hex The hex to check * @param entity The entity to check * @return The effective elevation */ private int calculateUnitElevationInHex(IHex hex, Entity entity) { // we calculate the height of a hex as "on the ground" by default // Special exceptions: // We are a mech, which can hopping on top of some buildings // We are naval unit going under a bridge, in which case the height is the water level (naval units go on the surface, mostly) // We are non-naval going into water but not onto a bridge, in which case the height is the floor (mechs sink to the bottom) int hexElevation = hex.getLevel(); if(entity.hasETypeFlag(Entity.ETYPE_MECH) && hex.containsTerrain(Terrains.BLDG_CF)) { hexElevation = hex.ceiling(); } else if(entity.isNaval() && hex.containsTerrain(Terrains.BRIDGE)) { hexElevation = hex.getLevel(); } else if(!entity.isSurfaceNaval() && hex.containsTerrain(Terrains.WATER) && !hex.containsTerrain(Terrains.BRIDGE)) { hexElevation = hex.floor(); } return hexElevation; }
/** * Flood negative hex levels Shoreline / salt marshes effect Works best with * more elevation */ protected static void postProcessFlood(IHex[] hexSet, int modifier) { int n; IHex field; ITerrainFactory f = Terrains.getTerrainFactory(); for (n = 0; n < hexSet.length; n++) { field = hexSet[n]; int elev = field.getLevel() - modifier; if ((elev == 0) && !(field.containsTerrain(Terrains.WATER)) && !(field.containsTerrain(Terrains.PAVEMENT))) { field.addTerrain(f.createTerrain(Terrains.SWAMP, 1)); } else if (elev < 0) { if (elev < -4) { elev = -4; } field.removeAllTerrains(); field.addTerrain(f.createTerrain(Terrains.WATER, -elev)); field.setLevel(modifier); } } }
/** * Returns a list of orthographic images to be tiled above the hex. As noted * above, all matches must be 1.0, and if such a match is achieved, all terrain * elements from the tileset hex are removed from the hex. Thus you want to pass * a copy of the original to this function. */ private List<Image> orthoFor(IHex hex, Component comp) { ArrayList<Image> matches = new ArrayList<Image>(); // find orthographic image matches for (HexEntry entry : orthos) { if (orthoMatch(hex, entry.getHex()) >= 1.0) { Image img = entry.getImage(comp, hex.getCoords().hashCode()); if (img != null) { matches.add(img); } else { matches.add(ImageUtil.createAcceleratedImage(HEX_W, HEX_H)); } // remove involved terrain from consideration for (int terr : entry.getHex().getTerrainTypes()) { if (entry.getHex().containsTerrain(terr)) { hex.removeTerrain(terr); } } } } return matches; }
final boolean isAmphibious = getEntity().hasWorkingMisc(MiscType.F_FULLY_AMPHIBIOUS) || getEntity().hasWorkingMisc(MiscType.F_LIMITED_AMPHIBIOUS); int nSrcEl = srcHex.getLevel() + prevEl; int nDestEl = destHex.getLevel() + elevation; && (moveMode != EntityMovementMode.QUAD_SWIM) && getClearance() == 0) { mp += destHex.movementCost(getEntity()); if(isAmphibious && !destHex.containsTerrain(Terrains.ICE) && (destHex.terrainLevel(Terrains.WATER) > 0)) { mp++; if (!destHex.containsTerrain(Terrains.ICE) || (nDestEl < destHex.surface())) { if ((destHex.terrainLevel(Terrains.WATER) == 1) && !isAmphibious) { mp++; } else if ((destHex.terrainLevel(Terrains.WATER) > 1) && !isAmphibious) { if (getEntity().hasAbility(OptionsConstants.PILOT_TM_FROGMAN) && ((entity instanceof Mech) || (entity instanceof Protomech))) { if (destHex.containsTerrain(Terrains.ICE) && !isCareful() && (nDestEl == destHex.surface())) { mp--; || (destHex.containsTerrain(Terrains.BLDG_ELEV) && destHex.ceiling() > srcHex.ceiling()))) { mp += 2;
boolean isHovercraft = entity.getMovementMode() == EntityMovementMode.HOVER; boolean isWheeled = entity.getMovementMode() == EntityMovementMode.WHEELED; boolean destHexHasRoad = destHex.containsTerrain(Terrains.ROAD); int srcHexElevation = calculateUnitElevationInHex(srcHex, entity); boolean destinationImpassable = destHex.containsTerrain(Terrains.IMPASSABLE); boolean destinationHasBuildingOrBridge = destinationBuilding != null; boolean destinationHasBridge = destinationHasBuildingOrBridge && destHex.containsTerrain(Terrains.BRIDGE_CF); boolean destinationHasBuilding = destinationHasBuildingOrBridge && destHex.containsTerrain(Terrains.BLDG_CF); (destHex.terrainLevel(Terrains.JUNGLE) > 0 || destHex.terrainLevel(Terrains.WOODS) > 1) && !destHexHasRoad; (destHex.terrainLevel(Terrains.JUNGLE) > 0 || destHex.terrainLevel(Terrains.WOODS) > 0) && !destHexHasRoad; (destHex.containsTerrain(Terrains.ROUGH) || destHex.containsTerrain(Terrains.RUBBLE) || destHex.containsTerrain(Terrains.BLDG_CF) || (destHex.containsTerrain(Terrains.SNOW) && destHex.terrainLevel(Terrains.SNOW) > 1)); destHex.containsTerrain(Terrains.WATER) && (destHex.depth() > 0) && !destHex.containsTerrain(Terrains.BRIDGE); (!destHex.containsTerrain(Terrains.WATER) || destHex.depth() < 1);
final IHex mockHexThree = Mockito.mock(IHex.class); final IHex mockFinalHex = Mockito.mock(IHex.class); Mockito.when(mockHexOne.getTerrainTypes()).thenReturn(new int[0]); Mockito.when(mockHexTwo.getTerrainTypes()).thenReturn(new int[0]); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[0]); Mockito.when(mockFinalHex.getTerrainTypes()).thenReturn(new int[0]); Mockito.when(mockHexOne.getCoords()).thenReturn(testCoordsOne); Mockito.when(mockHexTwo.getCoords()).thenReturn(testCoordsTwo); Mockito.when(mockHexThree.getCoords()).thenReturn(testCoordsThree); Mockito.when(mockFinalHex.getCoords()).thenReturn(testFinalCoords); Mockito.when(mockBA.getHeatCapacity()).thenReturn(999); Mockito.when(mockBA.isFireResistant()).thenReturn(true); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[]{Terrains.BUILDING, Terrains.FIRE}); Assert.assertEquals(0, testRanker.checkPathForHazards(mockPath, mockBA, mockGame), TOLERANCE); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[0]); Mockito.when(mockProto.getHeatCapacity()).thenReturn(999); Mockito.when(mockPath.isJumping()).thenReturn(false); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[]{Terrains.MAGMA}); Mockito.when(mockHexThree.terrainLevel(Terrains.MAGMA)).thenReturn(1); Assert.assertEquals(166.7, testRanker.checkPathForHazards(mockPath, mockProto, mockGame), TOLERANCE); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[0]); Mockito.when(mockHexThree.terrainLevel(Terrains.MAGMA)).thenReturn(0); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[]{Terrains.FIRE, Terrains.WOODS}); Assert.assertEquals(50.0, testRanker.checkPathForHazards(mockPath, mockProto, mockGame), TOLERANCE); Mockito.when(mockHexThree.getTerrainTypes()).thenReturn(new int[0]);
/** * In hexes with buildings, returns the elevation relative to the roof. Otherwise returns the elevation * relative to the surface. */ public int getClearance() { IHex hex = entity.getGame().getBoard().getHex(getPosition()); if (hex.containsTerrain(Terrains.BLDG_ELEV)) { return elevation - hex.terrainLevel(Terrains.BLDG_ELEV); } return elevation; }
Coords c = i.next(); IHex hex = server.getGame().getBoard().getHex(c); ITerrain terr = hex.getTerrain(Terrains.ELEVATOR); int elevation = hex.getLevel(); hex.setLevel(terr.getLevel()); hex.removeTerrain(Terrains.ELEVATOR); hex.addTerrain(tf.createTerrain(Terrains.ELEVATOR, elevation, true, terr.getExits())); server.getHexUpdateSet().add(c);