package nars.lab.grid2d.main;
import java.awt.Color;
import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Set;
import nars.NAR;
import nars.lab.grid2d.main.Action.Forward;
import nars.lab.grid2d.main.Action.Turn;
abstract public class GridAgent extends LocalGridObject {
public final ArrayDeque<Action> actions = new ArrayDeque(); //pending
public final ArrayDeque<Effect> effects = new ArrayDeque(); //results
public final Set<Object> inventory = new HashSet();
public NAR nar;
public GridAgent(int x, int y, NAR nar) {
super(x, y);
this.nar=nar;
}
public void act(Action a) {
a.createdAt = space.getTime();
actions.add(a);
}
public void perceive(Effect e) { effects.add(e); }
public Effect perceiveNext() {
if (effects.isEmpty())
return null;
return effects.pop();
}
float animationLerpRate = 0.5f; //LERP interpolation rate
public void forward(int steps) { act(new Forward(steps)); }
public void turn(int angle) { act(new Turn(angle(angle))); }
@Override
abstract public void update(Effect nextEffect);
@Override
public void draw() {
cx = (cx * (1.0f - animationLerpRate)) + (x * animationLerpRate);
cy = (cy * (1.0f - animationLerpRate)) + (y * animationLerpRate);
cheading = (cheading * (1.0f - animationLerpRate/2.0f)) + (heading * animationLerpRate/2.0f);
float scale = (float)Math.sin(space.getTime()/7f)*0.05f + 1.0f;
space.pushMatrix();
space.translate(cx, cy);
space.scale(scale*0.8f);
/*if(!(nar.memory.executive.next.isEmpty())) {
space.fill(Color.RED.getRGB(), 255);
} else */{
space.fill(Color.ORANGE.getRGB(), 255);
}
space.ellipse(0,0, 1, 1);
//eyes
space.fill(Color.BLUE.getRGB(), 255);
space.rotate((float)(Math.PI/180f * cheading));
space.translate(-0.15f, 0.4f);
space.ellipse(0,0,0.2f,0.2f);
space.translate(0.3f, 0.0f);
space.ellipse(0,0,0.2f,0.2f);
space.popMatrix();
}
}