/** * */ package iamrescue.routing.costs; import iamrescue.belief.IAMWorldModel; import iamrescue.execution.command.IPath.BlockedState; import iamrescue.util.PositionXY; import rescuecore2.standard.entities.Area; import rescuecore2.standard.entities.Building; /** * @author Sebastian * */ public class SimpleDistanceRoutingCostFunction extends AbstractRoutingCostFunction { // public static final SimpleDistanceRoutingCostFunction DEFAULT_INSTANCE = // new SimpleDistanceRoutingCostFunction(); public static final SimpleDistanceRoutingCostFunction DEFAULT_NO_BLOCK_INSTANCE = new SimpleDistanceRoutingCostFunction( null, true); private boolean ignoreBlocks = false; private double burningPenalty = 0; protected IAMWorldModel worldModel; /** * */ public SimpleDistanceRoutingCostFunction(IAMWorldModel worldModel) { this(worldModel, false); this.worldModel = worldModel; } public SimpleDistanceRoutingCostFunction(IAMWorldModel worldModel, boolean ignoreBlocks) { this.ignoreBlocks = ignoreBlocks; this.worldModel = worldModel; } /** * @param burningPenalty * the burningPenalty to set */ public void setBurningPenalty(double burningPenalty) { this.burningPenalty = burningPenalty; } /** * @return the burningPenalty */ public double getBurningPenalty() { return burningPenalty; } @Override public double getTravelCost(Area area, PositionXY from, PositionXY to) { double cost = 0; if (burningPenalty > 0 && area instanceof Building) { Building b = (Building) area; if (b.isFierynessDefined()) { int fieryness = b.getFieryness(); if (fieryness >= 1 && fieryness <= 3) { cost += burningPenalty; } } } if (ignoreBlocks) { cost += from.distanceTo(to); } else { if (BlockCheckerUtil.getBlockedState(area, worldModel, from, to) .equals(BlockedState.BLOCKED)) { cost = Double.POSITIVE_INFINITY; } else { cost += from.distanceTo(to); } } return cost; } }