package rescuecore2.standard.score;
import rescuecore2.score.AbstractScoreFunction;
import rescuecore2.config.Config;
import rescuecore2.worldmodel.WorldModel;
import rescuecore2.worldmodel.Entity;
import rescuecore2.Timestep;
import rescuecore2.standard.entities.Civilian;
/**
Score function that measures the health of living civilians.
*/
public class HealthScoreFunction extends AbstractScoreFunction {
private static final String ABSOLUTE_KEY = "score.standard.health.absolute";
private static final double MAX = 10000;
private boolean absolute;
/**
Construct a HealthScoreFunction.
*/
public HealthScoreFunction() {
super("Civilian health");
}
@Override
public void initialise(WorldModel<? extends Entity> world, Config config) {
absolute = config.getBooleanValue(ABSOLUTE_KEY, false);
setName(absolute ? "Civilian health (absolute)" : "Civilian health (proportion)");
}
@Override
public double score(WorldModel<? extends Entity> world, Timestep timestep) {
double sum = 0;
double max = 0;
for (Entity next : world) {
if (next instanceof Civilian) {
Civilian c = (Civilian)next;
if (c.isHPDefined()) {
sum += c.getHP();
}
max += MAX;
}
}
if (absolute) {
return sum;
}
else {
return sum / max;
}
}
}