package rescuecore2.standard.kernel;
import rescuecore2.standard.entities.Civilian;
import rescuecore2.standard.entities.Refuge;
import rescuecore2.worldmodel.Entity;
import rescuecore2.config.Config;
import rescuecore2.log.Logger;
import kernel.KernelState;
import kernel.TerminationCondition;
/**
A TerminationCondition that terminates the simulation once all Civilians are either rescued or dead.
*/
public class CiviliansDeadOrRescuedTerminationCondition implements TerminationCondition {
@Override
public void initialise(Config config) {
}
@Override
public boolean shouldStop(KernelState k) {
for (Entity next : k.getWorldModel()) {
if (next instanceof Civilian) {
Civilian c = (Civilian)next;
if (!c.isHPDefined() || !c.isDamageDefined() || !c.isBuriednessDefined() || !c.isPositionDefined()) {
// Civilian with unknown state: we're not ready to stop.
return false;
}
if (c.getHP() <= 0) {
// Dead - ignore
continue;
}
if (c.getDamage() > 0 || c.getBuriedness() > 0) {
// Hurt or buried - keep running
return false;
}
Entity position = k.getWorldModel().getEntity(c.getPosition());
if (!(position instanceof Refuge)) {
// Alive but not in a refuge - keep running
return false;
}
}
}
// Found no reason to keep going so stop.
Logger.debug("CiviliansDeadOrRescuedTerminationCondition fired");
return true;
}
@Override
public String toString() {
return "All civilians rescued or dead";
}
}