package rescuecore2.standard.score; import rescuecore2.score.AbstractScoreFunction; import rescuecore2.config.Config; import rescuecore2.worldmodel.WorldModel; import rescuecore2.worldmodel.Entity; import rescuecore2.Timestep; import java.util.Map; import java.util.EnumMap; import rescuecore2.standard.entities.Building; import rescuecore2.standard.entities.StandardEntityConstants; /** Score function that measures the amount of damage done to buildings by fire. */ public class BuildingDamageScoreFunction extends AbstractScoreFunction { private static final String HEATING_FACTOR = "score.standard.building-fire.heating"; private static final String BURNING_FACTOR = "score.standard.building-fire.burning"; private static final String INFERNO_FACTOR = "score.standard.building-fire.inferno"; private static final String WATER_DAMAGE_FACTOR = "score.standard.building-fire.water-damage"; private static final String MINOR_DAMAGE_FACTOR = "score.standard.building-fire.minor-damage"; private static final String MODERATE_DAMAGE_FACTOR = "score.standard.building-fire.moderate-damage"; private static final String SEVERE_DAMAGE_FACTOR = "score.standard.building-fire.severe-damage"; private static final String BURNT_OUT_FACTOR = "score.standard.building-fire.burnt-out"; private static final String ABSOLUTE_KEY = "score.standard.building-fire.absolute"; private Map<StandardEntityConstants.Fieryness, Double> factors; private boolean absolute; /** Construct a BuildingDamageScoreFunction. */ public BuildingDamageScoreFunction() { super("Building damage"); } @Override public void initialise(WorldModel<? extends Entity> world, Config config) { factors = new EnumMap<StandardEntityConstants.Fieryness, Double>(StandardEntityConstants.Fieryness.class); factors.put(StandardEntityConstants.Fieryness.UNBURNT, 1.0); factors.put(StandardEntityConstants.Fieryness.HEATING, config.getFloatValue(HEATING_FACTOR)); factors.put(StandardEntityConstants.Fieryness.BURNING, config.getFloatValue(BURNING_FACTOR)); factors.put(StandardEntityConstants.Fieryness.INFERNO, config.getFloatValue(INFERNO_FACTOR)); factors.put(StandardEntityConstants.Fieryness.WATER_DAMAGE, config.getFloatValue(WATER_DAMAGE_FACTOR)); factors.put(StandardEntityConstants.Fieryness.MINOR_DAMAGE, config.getFloatValue(MINOR_DAMAGE_FACTOR)); factors.put(StandardEntityConstants.Fieryness.MODERATE_DAMAGE, config.getFloatValue(MODERATE_DAMAGE_FACTOR)); factors.put(StandardEntityConstants.Fieryness.SEVERE_DAMAGE, config.getFloatValue(SEVERE_DAMAGE_FACTOR)); factors.put(StandardEntityConstants.Fieryness.BURNT_OUT, config.getFloatValue(BURNT_OUT_FACTOR)); absolute = config.getBooleanValue(ABSOLUTE_KEY, false); } @Override public double score(WorldModel<? extends Entity> world, Timestep timestep) { double sum = 0; double max = 0; for (Entity next : world) { if (next instanceof Building) { Building b = (Building)next; if (!b.isTotalAreaDefined()) { continue; } int importance = b.isImportanceDefined() ? b.getImportance() : 1; double area = b.getTotalArea() * importance; StandardEntityConstants.Fieryness fire = b.getFierynessEnum(); double factor; if (fire == null) { factor = 1; } else { factor = factors.get(fire); } sum += area * factor; max += area; } } if (absolute) { return sum; } else { return sum / max; } } }