if (movementType != IEntityMovementType.MOVE_JUMP && !(entity.getElevation() > destHex.surface()) && !(entity.getMovementMode() == IEntityMovementMode.HOVER || entity.getMovementMode() == IEntityMovementMode.NAVAL || entity.getMovementMode() == IEntityMovementMode.HYDROFOIL || entity .getMovementMode() == IEntityMovementMode.SUBMARINE) && destHex.terrainLevel(Terrains.WATER) > 0 && !isPavementStep) { return true; }
    public static boolean isPilotingSkillNeeded(IGame game, int entityId,                                                Coords src, Coords dest,                                                int movementType,                                                boolean isTurning,                                                boolean prevStepIsOnPavement,                                                int srcElevation,                                                int destElevation) {        final Entity entity = game.getEntity(entityId);        final IHex srcHex = game.getBoard().getHex(src);        final IHex destHex = game.getBoard().getHex(dest);        final boolean isInfantry = ( entity instanceof Infantry );        final boolean isPavementStep = canMoveOnPavement( game, src, dest );        // arguments valid?        if (entity == null) {            throw new IllegalArgumentException("Entity invalid.");        }        if (src.distance(dest) > 1) {            throw new IllegalArgumentException("Coordinates must be adjacent.");        }        // let's only worry about actual movement, please        if (src.equals(dest)) {            return false;        }        // check for rubble        if (movementType != IEntityMovementType.MOVE_JUMP            && destHex.terrainLevel(Terrains.RUBBLE) > 0            && entity.getMovementMode() != IEntityMovementMode.VTOL            && !isInfantry) {            return true;        }                // check for swamp        if (destHex.containsTerrain(Terrains.SWAMP)            && !(entity.getElevation() > destHex.getElevation())            && entity.getMovementMode() != IEntityMovementMode.HOVER            && entity.getMovementMode() != IEntityMovementMode.VTOL            && movementType != IEntityMovementType.MOVE_JUMP) {            return true;        }        // Check for water unless we're a hovercraft or naval or using a bridge or flying.        if (movementType != IEntityMovementType.MOVE_JUMP            && !(entity.getElevation() > destHex.surface())            && !(entity.getMovementMode() == IEntityMovementMode.HOVER                || entity.getMovementMode() == IEntityMovementMode.NAVAL                || entity.getMovementMode() == IEntityMovementMode.HYDROFOIL                || entity.getMovementMode() == IEntityMovementMode.SUBMARINE)            && destHex.terrainLevel(Terrains.WATER) > 0            && !isPavementStep) {            return true;        }        // Check for skid.  Please note, the skid will be rolled on the        // current step, but starts from the previous step's location.        // TODO: add check for elevation of pavement, road,        //       or bridge matches entity elevation.        /* Bug 754610: Revert fix for bug 702735.        if ( ( srcHex.contains(Terrain.PAVEMENT) ||               srcHex.contains(Terrain.ROAD) ||               srcHex.contains(Terrain.BRIDGE) )        */        if ( prevStepIsOnPavement        //   && overallMoveType == IMoveType.MOVE_RUN             && movementType == IEntityMovementType.MOVE_RUN             && isTurning             && !isInfantry ) {            return true;        }        // If we entering or leaving a building, all non-infantry        // need to make a piloting check to avoid damage.        // TODO: allow entities to occupy different levels of buildings.        if ( ( srcElevation < srcHex.terrainLevel( Terrains.BLDG_ELEV ) ||               destElevation < destHex.terrainLevel( Terrains.BLDG_ELEV ) ) &&             !(entity instanceof Infantry) ) {            return true;        }                //check sideslips        if (entity instanceof VTOL) {            if (isTurning                    && ((movementType == IEntityMovementType.MOVE_RUN)                    || (movementType == IEntityMovementType.MOVE_VTOL_RUN)))            return true;        }        return false;    }