package sample;
import java.util.List;
import java.util.Collection;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import rescuecore2.worldmodel.EntityID;
import rescuecore2.worldmodel.ChangeSet;
import rescuecore2.messages.Command;
import rescuecore2.registry.Registry;
import rescuecore2.registry.FilterEntityFactory;
import rescuecore2.registry.FilterPropertyFactory;
import rescuecore2.standard.entities.StandardEntityURN;
import rescuecore2.standard.entities.StandardPropertyURN;
import rescuecore2.standard.entities.StandardEntityFactory;
import rescuecore2.standard.entities.StandardPropertyFactory;
import rescuecore2.standard.entities.Civilian;
import rescuecore2.log.Logger;
/**
A sample civilian agent.
*/
public class SampleCivilian extends AbstractSampleAgent<Civilian> {
private static final double DEFAULT_HELP_PROBABILITY = 0.1;
private static final double DEFAULT_OUCH_PROBABILITY = 0.1;
private static final int DEFAULT_CONSCIOUS_THRESHOLD = 2500;
private static final String HELP_PROBABILITY_KEY = "civilian.help.probability";
private static final String OUCH_PROBABILITY_KEY = "civilian.ouch.probability";
private static final String CONSCIOUS_THRESHOLD_KEY = "civilian.conscious.threshold";
private static final String OUCH = "Ouch";
private static final String HELP = "Help";
private double helpProbability;
private double ouchProbability;
private int consciousThreshold;
@Override
public String toString() {
return "Sample civilian";
}
@Override
protected void postConnect() {
super.postConnect();
// model.indexClass(StandardEntityURN.REFUGE);
helpProbability = config.getFloatValue(HELP_PROBABILITY_KEY, DEFAULT_HELP_PROBABILITY);
ouchProbability = config.getFloatValue(OUCH_PROBABILITY_KEY, DEFAULT_OUCH_PROBABILITY);
consciousThreshold = config.getIntValue(CONSCIOUS_THRESHOLD_KEY, DEFAULT_CONSCIOUS_THRESHOLD);
Logger.info("Civilian " + getID() + " connected");
Civilian me = me();
// Remove all entities except me
model.removeAllEntities();
model.addEntity(me);
}
@Override
public Registry getPreferredRegistry(Registry parent) {
// Return a registry that filters out buildings and civilians
Registry result = new Registry("SampleCivilian filter registry", super.getPreferredRegistry(parent));
Set<String> entityURNs = new HashSet<String>();
entityURNs.add(StandardEntityURN.BUILDING.toString());
entityURNs.add(StandardEntityURN.REFUGE.toString());
entityURNs.add(StandardEntityURN.ROAD.toString());
entityURNs.add(StandardEntityURN.CIVILIAN.toString());
Set<String> propertyURNs = new HashSet<String>();
propertyURNs.add(StandardPropertyURN.X.toString());
propertyURNs.add(StandardPropertyURN.Y.toString());
propertyURNs.add(StandardPropertyURN.EDGES.toString());
propertyURNs.add(StandardPropertyURN.DAMAGE.toString());
propertyURNs.add(StandardPropertyURN.BURIEDNESS.toString());
propertyURNs.add(StandardPropertyURN.HP.toString());
propertyURNs.add(StandardPropertyURN.POSITION.toString());
result.registerEntityFactory(new FilterEntityFactory(StandardEntityFactory.INSTANCE, entityURNs, true));
result.registerPropertyFactory(new FilterPropertyFactory(StandardPropertyFactory.INSTANCE, propertyURNs, true));
return result;
}
@Override
protected void think(int time, ChangeSet changed, Collection<Command> heard) {
// If we're not hurt or buried run for a refuge!
Civilian me = me();
// Remove all entities except me
model.removeAllEntities();
model.addEntity(me);
int damage = me.isDamageDefined() ? me.getDamage() : 0;
int hp = me.isHPDefined() ? me.getHP() : 0;
int buriedness = me.isBuriednessDefined() ? me.getBuriedness() : 0;
if (hp <= 0 || hp < consciousThreshold) {
// Unconscious (or dead): do nothing
Logger.info("Unconcious or dead");
sendRest(time);
return;
}
if (damage > 0 && random.nextDouble() < ouchProbability) {
Logger.info("Shouting in pain");
say(OUCH, time);
}
if (buriedness > 0 && random.nextDouble() < helpProbability) {
Logger.info("Calling for help");
say(HELP, time);
}
if (damage == 0 && buriedness == 0) {
// Run for the refuge
List<EntityID> path = search.breadthFirstSearch(me().getPosition(), refugeIDs);
/* if (path != null) {
Logger.info("Heading for a refuge");
sendMove(time, path);
return;
}
else {
Logger.info("Moving randomly");
sendMove(time, randomWalk());
return;
}*/
double t=random.nextDouble();
if (path != null) {
if(t<0.75){
Logger.info("Heading for a refuge");
sendMove(time, path);
return;
}
else
{
Logger.info("Moving randomly");
sendMove(time, randomWalk());
return;
}
}
else
{
Logger.info("Moving randomly");
sendMove(time, randomWalk());
return;
}
}
Logger.info("Not moving: damage = " + damage + ", buriedness = " + buriedness);
sendRest(time);
}
@Override
protected EnumSet<StandardEntityURN> getRequestedEntityURNsEnum() {
return EnumSet.of(StandardEntityURN.CIVILIAN);
}
@Override
protected boolean shouldIndex() {
return false;
}
private void say(String message, int time) {
try {
if (useSpeak) {
sendSpeak(time, 0, message.getBytes("UTF-8"));
}
else {
sendSay(time, message.getBytes("UTF-8"));
}
}
catch (java.io.UnsupportedEncodingException e) {
throw new RuntimeException("This should not have happened!", e);
}
}
}