public void DrawPieceInWorld(Termite piece) {

    int x = piece.getX();
    int y = piece.getY();
    this.getVal(x, y).type = piece.getType();

    if (!this.getVal(x, y).isHome && !this.getVal(x, y).isTarget) {
      if (((Termite) piece).getDiagnoseStatus() != Termite.NOTDIAGNOSE) {
        this.getVal(x, y).value = (float) 3;
      } else if (((Termite) piece).getStatus() == Termite.CARRYING) {
        this.getVal(x, y).value = (float) 4;
        // } else if (!piece.diagnoseVM.isCanDiagnose()) {
        //     this.getVal(x, y).value = (float) 5;
      } else if (((Termite) piece).getStatus() == StateProps.LEADER) {
        this.getVal(x, y).value = StateProps.LEADER;
      } else {
        this.getVal(x, y).value = (float) 1;
      }
    }
  }
  public boolean updatePiecesInWorld(Termite piece, int direction) {
    if (Directions.NONE == direction) {
      return true;
    }
    // 2011.04.06 review collitions in a fast way
    if (hasCollisions(piece, direction)) {
      //    direction = (int) (Math.random() * 8.0);
      return false;
    }

    if (!this.getVal((int) (piece.getX()), (int) (piece.getY())).isHome
        && !this.getVal((int) (piece.getX()), (int) (piece.getY())).isTarget) {
      this.getVal((int) (piece.getX()), (int) (piece.getY())).type = StateProps.NEUTRAL;
      this.getVal((int) (piece.getX()), (int) (piece.getY())).value = (float) 0.5;
    }

    if (direction == Directions.UP) {
      piece.setY(piece.getY() - 1);
    }
    if (direction == Directions.DOWN) {
      piece.setY(piece.getY() + 1);
    }
    if (direction == Directions.LEFT) {
      piece.setX(piece.getX() - 1);
    }
    if (direction == Directions.RIGHT) {
      piece.setX(piece.getX() + 1);
      piece.setX(piece.getX() % this.width);
    }

    if (direction == Directions.DOWNLEFT) {
      piece.setX(piece.getX() - 1);
      piece.setY(piece.getY() + 1);
    }
    if (direction == Directions.DOWNRIGHT) {
      piece.setY(piece.getY() + 1);
      piece.setX(piece.getX() + 1);
    }
    if (direction == Directions.UPLEFT) {
      piece.setX(piece.getX() - 1);
      piece.setY(piece.getY() - 1);
    }
    if (direction == Directions.UPRIGHT) {
      piece.setY(piece.getY() - 1);
      piece.setX(piece.getX() + 1);
    }
    if (piece.getY() < 0) {
      piece.setY(this.height - 1);
    }
    if (piece.getX() < 0) {
      piece.setX(this.width - 1);
    }
    piece.setY(piece.getY() % this.height);
    piece.setX(piece.getX() % this.width);
    return true;
  }
 @Override
 public void init(Agent agent) {
   Termite sim_agent = (Termite) agent;
   sim_agent.run();
 }
  @Override
  public boolean act(Agent agent, Action action) {
    String act = action.getCode();
    Termite t = (Termite) agent;
    t.setRound(t.getRound() + 1);
    StateProps box = getVal(t.getX(), t.getY());
    t.sleep(15);

    // Agent Die and dissapears from the world
    if (act.equals("die")) {
      t.die();
      this.getVal((int) (t.getX()), (int) (t.getY())).type = StateProps.NEUTRAL;
      this.getVal((int) (t.getX()), (int) (t.getY())).value = (float) 0.5;
      increaseAgentsDie();
      updateSandC();
      return false;
    }

    // Read data in current location
    float temp = getTemperaturePercept(agent);
    String loc = t.getX() + "-" + t.getY();

    if (!((Hashtable) t.getAttribute("inf_i")).containsKey(loc)) {
      t.incExploredTerrain();
      if (t.getStatus() == Termite.SEEKING) {
        t.setPheromone((float) 0);
      }
      if (t.getStatus() == Termite.CARRYING) {
        t.setPheromone((float) 1);
      }
      ((Hashtable) t.getAttribute("inf_i")).put(loc, temp);
    }

    // sense other and send its information
    String idOther = getIdNeighborPercept(agent);

    // If there is another neighbor send its current information
    if (idOther != null) {
      if (!((Hashtable) t.getAttribute("inf_i")).isEmpty()) {
        String[] msg = new String[2]; // msg: [from|msg]
        msg[0] = (String) t.getAttribute("ID");
        msg[1] = StringSerializer.serialize(((Hashtable) t.getAttribute("inf_i")));
        NetworkMessageBuffer.getInstance().putMessage(idOther, msg);
      }
      t.incMsgSend();
    }

    String myID = (String) t.getAttribute("ID");
    String[] inbox = NetworkMessageBuffer.getInstance().getMessage(myID);

    // inbox: id | infi
    if (inbox != null) {
      t.incMsgRecv();
      boolean gotNewInf = false;
      Hashtable senderInf = (Hashtable) StringSerializer.deserialize(inbox[1]);
      Hashtable inf_i = ((Hashtable) t.getAttribute("inf_i"));

      int oldsize = inf_i.size();
      inf_i = HashtableOperations.JoinSets(inf_i, senderInf);

      t.setAttribute("inf_i", inf_i);
      if (inf_i.size() > oldsize) {
        gotNewInf = true;
      }

      // Evaluates Differences
      if (!gotNewInf) {
        t.setPheromone((float) 1.0);
        t.setStatus(Termite.CARRYING);
      } else {
        t.setPheromone((float) 0);
        t.setStatus(Termite.SEEKING);
      }
    }

    // Verifies its information is complete
    boolean complete = false;
    int aminfo = ((Hashtable) t.getAttribute("inf_i")).size();
    // System.out.println("aminfo:" + aminfo + ", size:" + width * height);
    if (completeInfo(aminfo)) {
      complete = true;
    }

    if (getRoundGetInfo() == -1 && complete) {
      System.out.println("complete! round" + t.getRound());
      setRoundGetInfo(t.getRound());
      setIdBest(t.getId());
      updateSandC();
    }

    // adjust ant's pheromone (via learning rule; goes down to 0.5)
    t.setPheromone((float) (t.getPheromone() + 0.01f * (0.5f - t.getPheromone())));

    // by now I store the pheromone in all until get the best.
    // I know it's hardcoded but is experimental.
    /*if (getRoundGetInfo() == -1) {
    t.getPhHistory().put(t.getRound(), t.getPheromone());
    t.getInfHistory().put(t.getRound(), aminfo);
    }*/
    box.pherovalue =
        (float) (box.pherovalue + 0.01 * (((Termite) t).getPheromone() - box.pherovalue));
    boolean executed;
    if (AppMain.walls.equals("wallsoff")) {
      executed = updatePiecesInWorld(t, this.getActionIndex(act));
    } else {
      executed = updatePiecesInWorldNotToroidal(t, this.getActionIndex(act));
    }
    DrawPieceInWorld(t);
    return executed;
  }